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
})();
优质内容筛选与推荐>>
1、JS图片预加载
2、codevs3145 汉诺塔游戏(经典中的经典,不能再经典了)
3、getComputedStyle的简单用法
4、flask上传文件到指定路径
5、mysql 索引


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号