标签:类型 变量 asc type 全局变量 oba func 未定义 style
(function() { var x=foo(); var foo=function foo() { return ‘foobar‘ }; return x; })();
这段代码运行后报错:Uncaught TypeError: foo is not a function
原因在于变量foo的声明提升,后面的赋值,函数表达式不会提升,因此当代码运行到 var x=foo(); 时,
foo()是未定义的。
可以把 var x=foo(); 放到 变量 foo 后再执行:
(function() { var foo=function foo() { return ‘foobar‘ }; var x=foo(); return x; })();
函数声明整个提升到作用域顶部,比如这样写:
(function() { var x=foo(); function foo() { return ‘foobar‘ } return x; })();
再看一个例子:
var foo = {n:1}; (function (foo) { //注意这里,传进参数 foo console.log(foo.n); foo.n=3; //全局变量重新赋值, var foo={n:2}; //局部变量foo进行重新赋值 console.log(foo.n); })(foo); console.log(foo.n);//全局变量已经是 n:3
关于var x1=foo(); 和 var x2=foo; 有没括号的区别
函数是一种叫做function引用类型的实例,因此函数是一个对象。对象是保存在内存中的,函数名则是指向这个对象的指针。
函数可以作为参数传入别的函数,也可以作为一个函数的返回值,也可以被重新赋值。
简单来说,x1是函数foo()的返回值,x2是函数foo()本身。
(function() { var foo=function foo() { return ‘foobar‘ }; var x=foo; return x; })(); //function foo() { return ‘foobar‘ }
标签:类型 变量 asc type 全局变量 oba func 未定义 style
原文地址:http://www.cnblogs.com/dodocie/p/7290387.html