函数表达式和函数声明

学习文章----汤姆大叔的博客

总结笔记

 

函数声明:

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在函数被调用的时候才确定。

posted @ 2016-11-19 18:42  FatDong  阅读(253)  评论(0编辑  收藏  举报