javascript的变量声明提升
这篇随笔是对网上文章的整理吸收
1. javascript的作用域是函数,不是块
2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升。
看下面例子:
var v = "hello";
(function(){
console.log(v);
// var v = "world";
})();
输出值为 hello
var v = "hello";
(function(){
console.log(v);
var v = "world";
})();
输出值为undefined
why?
因为第二个函数javascript解释器会解释成下面这样执行
var v = "hello";
(function () {
var v;
console.log(v);
v = "world";
})();
变量v没有赋值所以输出undefind。
函数和变量的声明会被提升,函数定义和变量定义不会被提升
看下面例子
(function(){
f1();
var f1 = function(){};
})();
**上面函数执行会报 **
TypeError: undefined is not a function
这个很好解释,因为函数会被javascript解释为
(function () {
var f;
f1();
f1 = function () {
};
})();
下面这个函数可以运行,不要觉得奇怪
(function () {
f2();
function f2() {
console.log('will run !');
}
})();
因为它被解释成下面这样了。函数定义被提到最前面了。
(function () {
function f2() {
console.log('will run !');
}
f2();
})();
猜猜下面代码执行效果?
(function(){
var foo;
console.log(typeof foo); //function
function foo(){}
foo = "foo";
console.log(typeof foo); //string
})();
为什么?因为它同下面这个函数是一样的。
(function(){
var foo;
function foo(){}
console.log(typeof foo); //function
foo = "foo";
console.log(typeof foo); //string
})();