1.js解析器会优先读取函数申明,即使函数调用在申明之前,
aaa(); //函数申明 function aaa(){ alert(1); // 1 }
而函数表达式必须等到执行到它所在的代码行时,才会被解释执行,如果提前调用,则会报错,
bbb(); //函数表达式 var bbb = function(){ alert(2); // TypeError: bbb is not a function }
2.当函数申明的函数名与变量重复时(不推荐这样的做法),会优先解析函数申明,
function a(){ var ccc; alert(typeof ccc); //function function ccc(){ } } a();
3.(function(){})()——这种形式也是函数表达式。
4.具名函数表达式,也叫作自执行函数:比如
var ddd = function sum(){}
此时,只能通过ddd()来执行函数,外部不能调用sum()来执行,函数内部则可以访问到sum(),
var ddd = function sum(){ console.log(‘内部的sum是‘+typeof sum); //内部的sum是function } console.log(‘外部的sum是‘+typeof sum); //外部的sum是undefined ddd();
5.对象内部的函数表达式,在函数表达式内部能不能访问存放当前函数的变量。
var o = { aaa:function(){ console.log(aaa); } } o.aaa(); //ReferenceError: aaa is not defined
有一个例子:
function fn(){ ① return { fn:function(){ ② return fn(); ③ }; } }
①fn执行的时候,返回了一个对象,假设接着又调用了这个对象中的fn②,返回的fn③其实就是fn①,因为刚才上面的例子说了,对象内的函数表达式的内部fn③无法访问到fn②。
function fn(a, b){ console.log(b); return { fn:function(c){ return fn(c, a); } } } var one = fn(1); //undefined var two = one.fn(0); // 1
第5条是受到《大部分人都会做错的经典JS闭包面试题》中启发。
时间: 2024-10-27 12:09:40