函数表达式和函数声明
Posted FatDong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数表达式和函数声明相关的知识,希望对你有一定的参考价值。
学习文章----汤姆大叔的博客
总结笔记
函数声明:
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在函数被调用的时候才确定。
以上是关于函数表达式和函数声明的主要内容,如果未能解决你的问题,请参考以下文章