当前位置:  开发笔记 > 编程语言 > 正文

在JavaScript中声明函数

如何解决《在JavaScript中声明函数》经验,为你挑选了4个好方法。

我和大多数人在这里有不同的看法.从技术上讲,这种语法对于两种方式声明函数可能意味着相同 (我在上一篇声明中表示不正确.我读了一篇差异文章,为什么它们在技术上是差异的,我会在最后添加,为什么); 但他们在不断发展的模式中发挥作用的方式是巨大的.我强烈推荐Doughlas Crockford的"Javascript:The Good Parts".

但要以一种微妙而简单的方式证明我的观点; 这是一个小例子.

//Global function existing to serve everyone
function swearOutLoud(swearWord) {
    alert("You "+ swearWord);           
}
//global functions' territory ends here

//here is mr. spongebob. He is very passionate about his objects; but he's a bit rude.
var spongeBob = {
    name : "squarePants",
    swear : function(swearWord) {
                name = "spongy";
                alert("You "+ swearWord);
                return this;
            }
}

//finally spongebob learns good manners too. EVOLUTION!
spongeBob.apologize = function() {
    alert("Hey " + this.name + ", I'm sorry man!");
    return this;
}


//Ask spongebob to swear and then apologize in one go (CASCADING EFFECT!!)
alert(spongeBob.swear("twit").apologize());

如果你查看上面的代码,我声明了一个名为swearOutLoud的函数.哪个会从任何对象或电话中咒骂,并会给你输出.它可以使用传递给它的"this"参数和参数对任何对象执行操作.

但是,第二个声明被声明为对象的属性,称为"spongeBob".这一点很重要; 在这里,我正朝着对象驱动的行为迈进.虽然我仍然保持"级联效应",因为如果我没有别的东西可以返回,我会返回"这个".

类似的东西在jquery中完成; 如果您正在尝试编写框架或其他内容,这种级联模式很重要.您还可以将它链接到Builder设计模式.

但是,将函数声明为对象的属性,我能够实现以对象为中心的行为,从而产生更好的编程范例.除非设计得好; 在全局访问之外声明的单个函数导致非面向对象的编码方式.我不知何故更喜欢后者.

要查看级联效果,请查看最后一条声明,您可以让海绵宝宝立即发誓并道歉; 即使后来道歉被添加为属性.

我希望我明白我的观点.从技术角度来看,差异可能很小; 但从设计和代码演变的角度来看,它是巨大的,并创造了一个与众不同的世界.

但那就是我!要么接受,要么离开它.:)

编辑:

所以这两个电话在技术上都是不同的; 因为命名声明与全局命名空间绑定,并且在解析时定义.所以甚至可以在声明函数之前调用它.

 //success
 swearOutLoud("Damn");

function swearOutLoud(swearWord) {
    alert("You " + swearWord)
}

上面的代码将正常工作.但是下面的代码不会.

swear("Damn!");
    var swear = function(swearWord) {
    console.log(swearWord);
}

其中主要部分尚不清楚,与此问题无关. (28认同)


Igor Zevaka.. 14

使用的一个优点function someFunc() { ... }是函数名称出现在Firebug调试器中.以另一种方式声明的函数(var someFunc = function() { ... })以匿名方式显示.



1> Priyank..:

我和大多数人在这里有不同的看法.从技术上讲,这种语法对于两种方式声明函数可能意味着相同 (我在上一篇声明中表示不正确.我读了一篇差异文章,为什么它们在技术上是差异的,我会在最后添加,为什么); 但他们在不断发展的模式中发挥作用的方式是巨大的.我强烈推荐Doughlas Crockford的"Javascript:The Good Parts".

但要以一种微妙而简单的方式证明我的观点; 这是一个小例子.

//Global function existing to serve everyone
function swearOutLoud(swearWord) {
    alert("You "+ swearWord);           
}
//global functions' territory ends here

//here is mr. spongebob. He is very passionate about his objects; but he's a bit rude.
var spongeBob = {
    name : "squarePants",
    swear : function(swearWord) {
                name = "spongy";
                alert("You "+ swearWord);
                return this;
            }
}

//finally spongebob learns good manners too. EVOLUTION!
spongeBob.apologize = function() {
    alert("Hey " + this.name + ", I'm sorry man!");
    return this;
}


//Ask spongebob to swear and then apologize in one go (CASCADING EFFECT!!)
alert(spongeBob.swear("twit").apologize());

如果你查看上面的代码,我声明了一个名为swearOutLoud的函数.哪个会从任何对象或电话中咒骂,并会给你输出.它可以使用传递给它的"this"参数和参数对任何对象执行操作.

但是,第二个声明被声明为对象的属性,称为"spongeBob".这一点很重要; 在这里,我正朝着对象驱动的行为迈进.虽然我仍然保持"级联效应",因为如果我没有别的东西可以返回,我会返回"这个".

类似的东西在jquery中完成; 如果您正在尝试编写框架或其他内容,这种级联模式很重要.您还可以将它链接到Builder设计模式.

但是,将函数声明为对象的属性,我能够实现以对象为中心的行为,从而产生更好的编程范例.除非设计得好; 在全局访问之外声明的单个函数导致非面向对象的编码方式.我不知何故更喜欢后者.

要查看级联效果,请查看最后一条声明,您可以让海绵宝宝立即发誓并道歉; 即使后来道歉被添加为属性.

我希望我明白我的观点.从技术角度来看,差异可能很小; 但从设计和代码演变的角度来看,它是巨大的,并创造了一个与众不同的世界.

但那就是我!要么接受,要么离开它.:)

编辑:

所以这两个电话在技术上都是不同的; 因为命名声明与全局命名空间绑定,并且在解析时定义.所以甚至可以在声明函数之前调用它.

 //success
 swearOutLoud("Damn");

function swearOutLoud(swearWord) {
    alert("You " + swearWord)
}

上面的代码将正常工作.但是下面的代码不会.

swear("Damn!");
    var swear = function(swearWord) {
    console.log(swearWord);
}


其中主要部分尚不清楚,与此问题无关.

2> Igor Zevaka..:

使用的一个优点function someFunc() { ... }是函数名称出现在Firebug调试器中.以另一种方式声明的函数(var someFunc = function() { ... })以匿名方式显示.



3> Soufiane Has..:

实际上,不同之处在于第二个声明使我们能够声明这样的函数,从而可以将函数作为对象的属性:

var myObject=new Object();
myObject.someFunc=function() { ... }; 



4> frglps..:

风格方面,第二个例子与声明函数的其他常用方法更加一致,因此可以认为它更具可读性

this.someFunc = function() { ... }
...
someFunc: function() { ... },

但是,正如前面提到的那样它是匿名的,因此在分析时不会出现名称.声明该功能的另一种方法如下,它可以让您获得两全其美的效果

var someFunc = function someFunc() { ... }

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有