zoukankan      html  css  js  c++  java
  • JavaScript的那些坑之变量提升

    想总结一下JS的变量提升特性,都是由于一道题。先上题。

    var name = 'World!';
    (function () {
      	if (typeof name === 'undefined') {
      		var name = 'Jack';
            console.log('Goodbye ' + name);
        }else{
            console.log('Hello ' + name);
        }
    })();

    这是JavaScript专业八级測试。你能做对几道?上的一道题。

    假设不知道JS的变量提升的话。绝对会以为world的name是全局变量,能够訪问到name,然后运行else里的语句。要是这么觉得就大错特错了。

    function能够訪问到name=World!这个全局变量这没错。可是function内部又定义了一个局部变量name,并且是用var定义,这样就截然不同了。那我们来做个实验。



    是否在函数内部定义Jack。对整个程序发生了质的变化。

    那么我们以下就来分析一下为什么会有这种变化。

    变量定义是存在作用域的,这里就不做累述。详细的能够到Javascript的变量和作用域问题(二)之作用域里查看。

    我们最基本的是了解下变量声明之后是怎么被解释器解释的,

    function foo() {
    	//something
    	var x = 1;
    }
    这个样例实际上和以下的样例是同样的。

    function foo() {
    	var x;
    	//something
    	x = 1;
    }
    也就是说。变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。



    要是这样讲没有说服力的话。再来用console.log试一下就好。

    function foo() {
    	console.log(x);   //undefined
    	var x = 1;
    }
    foo(); 
    非常明显,在var之前是訪问不到x的。由于var仅仅是定义了x,在console的时候并没有赋值,所以当然是undefined了。


    再回到最原先的题上,由于在匿名函数里又又一次定义了一遍name。所以name的var被悄悄的提到了函数的最前面。

    也变成了这样。

    var name = 'World!';
    (function () {
    	var name;      //变量提升了。

    if (typeof name === 'undefined') { name = 'Jack'; console.log('Goodbye ' + name); }else{ console.log('Hello ' + name); } })();

    name就变成了undefined,当然进入了if而不是进入else,自然而然也就打印出了Goodbye,Jack。

    一点补充。假设对于全局作用于范围的变量,var与不var是有差别的. 

        没有var的写法。其变量不会被提升。

    比方以下两个程序。第二个会报错:

    alert(a);
    var a=1;
    
    
    alert(a);
    a=1;


    总之。变量提示就是var在函数内部使用的时候,在var定义变量的语句之前是訪问不到变量的!

  • 相关阅读:
    Gitcafe绑定自定义域名
    如何优雅地使用Sublime Text
    使用Hexo搭建专属Blog
    How to Use Android ADB Command Line Tool
    雷军北大15分钟演讲:我至少有胆量去想(转)
    浅谈android中的目录结构
    react里 MD5加密
    git忽略相应文件夹,不上传
    antd-mobile的按需加载
    当react 项目使用px2rem
  • 原文地址:https://www.cnblogs.com/llguanli/p/6991673.html
Copyright © 2011-2022 走看看