函数表达式和函数声明
学习文章----汤姆大叔的博客
总结笔记
函数声明:
1.函数声明必须要有名称
2.位置只能在全局上下文和函数体内,不能出现在代码块(if)中
函数表达式:
特点:不会影响上下文的全局对象VO
var foo = {};
(function initialize() {
var x = 10;
foo.bar = function () {
alert(x);
};
})();
foo.bar(); // 10;
alert(x); // "x" 未定义
1.表达式可以没有名称,表达式不能以function开头
2.当表达式不在规定位置时,需要用分组操作符圆括号强制转化为表达式。如果解析器知道它是一个表达式,就没必要用圆括号。
var foo = {
bar: function (x) {
return x % 2 != 0 ? 'yes' : 'no';
}(1) //这里已经知道是表达式,就没有必要用圆括号
};
函数表达式在IE的JScript中的bug
1.函数表达式在变量对象中可见
2.①var foo = function bar(){}; //创建了两个对象foo和bar,
foo === bar; //false,但两个对象的输出结果是一样的
修改foo的属性值,不会影响bar对象
var foo = function bar() {
alert('foo');
};
alert(typeof bar); // "function",
// 有趣的是
alert(foo === bar); // false!
foo.x = 10;
alert(bar.x); // 未定义
// 但执行的时候结果一样
foo(); // "foo"
bar(); // "foo"
②但是,如果将函数表达式bar单独描述,再赋值给foo,就符合我们的逻辑了
(function bar() {});
var foo = bar;//将bar的引用赋值给foo
alert(foo === bar); // true
foo.x = 10;
alert(bar.x); // 10
易错点:
①作用域链在函数定义的时候就已经确定了。[[scope]]在函数创建的时候就已经确定。
特例:通过函数构造函数创建的函数的[[scope]]始终为全局对象。var foo = new Function('alert(x);alert(y)');
②this在函数被调用的时候才确定。

浙公网安备 33010602011771号