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
})();
posted @ 2014-09-03 16:42  xiquwugou  阅读(123)  评论(0编辑  收藏  举报