zoukankan      html  css  js  c++  java
  • js的变量作用域 ,变量提升

    (function(){
        a = 5;
        alert(window.a);
        var a = 10;
        alert(a);
    })();
    

    结果: undefined 10


    代码等同于下面

    var a = undefined;   //定义全局变量
    (function(){
    	var a;     // 
        a = 5;     // a = 5;但是被局部变量覆盖,这时候的a是局部变量
        alert(window.a);  //a = undefined; 试图访问全局变量a,可是并没有赋值
        a = 10;           //依然是局部变量a
        alert(a);         //a = 10
    })();
    

    分析:
    1.在产生一个作用域的时候,会预编译一次里面的变量,其中的动作是将所有的变量名,函数名,提前定义,然后在赋予当前的变量的所在作用域,运行。
    2.变量名的定义会覆盖函数名,可是函数名(见下面)

    var a;
    function a(){
    	alert(12);
    }
    a();      //alert(12)
    a = 10;   
    a();      //Uncaught TypeError: a is not a function
    

    a的定义,function的定义 换个顺序

    	(function(){
    	   var a=10;
    	   function a(){
    	   	 alert(2);
    	   	 return 8;
    		}
    	   alert(a); 
    	   alert(a());//Uncaught TypeError: a is not a function
    	})();
    	//分析:a() 的函数名并不会覆盖变量名
    
    	function a(){
    	   	alert(2);
    	   	return 8;
    	}
    	(function(){
    	   var a=10;
    	   alert(a);   // 10
    	   alert(a());//结果:Uncaught TypeError: a is not a function;如果把函数名称换成c,那么js会往上级查找,如果在本作用域中找到a,那么直接调用,这时的调用会忽略a的类型(若类型的语言?)
    	   alert(window.a());// 2, 8
    	})();
    
    • 在建立以一个作用域时,编译时,变量的声明会提前,在确定作用域,运行。
    • js中的变量名不会被同名的函数覆盖,而同名的函数会被变量覆盖。
    • 在js中调用函数,如果有同名的变量,那么会直接调用这个变量,不会向上查找,如果没有这个变量,才会向上查找
  • 相关阅读:
    23. CTF综合靶机渗透(十六)
    1.7 xss之同源策略与跨域访问
    6.wireshark使用全解
    29.极具破坏力的DDoS:浅析其攻击及防御
    6.【转载】业务安全漏洞挖掘归纳总结
    28.【转载】挖洞技巧:APP手势密码绕过思路总结
    27.【转载】挖洞技巧:如何绕过URL限制
    WordPress整站轻松开启HTTPS
    观复嘟嘟观古今
    房价会下跌么?
  • 原文地址:https://www.cnblogs.com/Alencong/p/5869401.html
Copyright © 2011-2022 走看看