教主的代言人
04:JavaScript中函数的理解
2016-10-6 田大才子

1、函数是一个对象。

var add = new Function('a,b','return a + b');

因为函数是可以new的,每一个函数都是Function对象的一个副本。

当然,从来不会有人刻意的去这样创建一个函数。

也正是由于函数是一个对象,所以函数可以有自己的属性和方法。


2、JavaScript中仅存在函数级别的作用域。

2-1、花括号对于定义作用域是没有意义的。

以for循环的花括号为例说明:

############################

for(var i = 0; i < 1 ; i++){
    var inner = "我是内部变量??"
};
console.info(inner) 

############################
这段代码可以输出inner的值。


2-2、只要在函数内部定义的变量都可以被整个函数访问。

无论在哪里声明,例如:

############################

(function add(){
    console.info(a);
    var a = 10;
})();

############################

被()()包裹起来,只是为了自动执行。

和如下方法一致,只是为了少些一些代码而已:

############################

function add(){
    console.info(a);
    var a = 10;
}
add();

############################

上面这段代码打印的结果是undefined,而不是报错Error。

undefined的含义是定义了,但是还没有赋值罢了。

Error才是错误,undefined和错误没有任何关系。

可见JavaScript中函数内部变量的声明会被提前,但是赋值不会被提前。

原因在于JavaScript编译的方法所致,具体请自行百度吧。


3、既然函数是一个对象,那么他就可以被用来当作参数和返回值。

############################

var f1 = function(){
    return "我是f1";
}
var f2 = function(f1){
    return f1;
}
var f3 = f2(f1);
console.info(f3());

############################

我们发现f1这个函数确实可以作为参数和返回值。

通常我们把f1命名成callback,也许你就明白了回调函数就是这么一回事。


4、由于函数是一个对象,所以函数可以像普通变量一样被赋值。

############################

var f1 = function(){
    return "我是f1";
}
console.info(f1());
f1 = function(){
    return "我是被覆盖的f1"
}
console.info(f1());
############################


5、即时函数是创建完函数后立马执行。

上面谈到过这种形式

############################

(function add(){
   console.info(a);
   var a = 10;
})();

############################

其实下面这种形式也一样,只是写法上稍有不同。

############################
(function add(){
   console.info(a);
   var a = 10;
}());

############################

即时函数可以存在参数。

############################

var i = 10;

(function(w){
   console.info(w.i);
})(window);

############################

对于即时函数来说,个人感觉有没有函数的名称无所谓。

即时函数可以有返回值。

############################

var result = (function(){
   return 2 + 2;
})();
console.info(result);

############################

绝大多数框架都使用到了即时函数,

因为它可以包装很多执行的工作,

而且不会在留下任何全局变量。


发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容