zoukankan      html  css  js  c++  java
  • javascript变量作用域

    把《javascript高级程序设计》的变量和函数部分翻了一遍,感觉可以找些题看看了。遂找了写经典题目,逐一解析(第二题踩坑了~)

    先看题http://blog.csdn.net/YoungerChen/article/details/7934008

    均在非严格模式下:

    1.

    var a = 10;  
    function test() {  
        a = 100;  
        alert(a);  
        alert(this.a);  
        var a;  
        alert(a);  
    }  
    test(); 

    分析:全局变量var a = 10;此时 window.a=10;

    注意在方法内有var a;有个很重要的概念:变量声明提前。所有上述代码等同于

    var a = 10;  
    function test() {  
        var a = 100;  
        alert(a);  
        alert(this.a);    
        alert(a);  
    }  
    test(); 

    所以函数内的局部变量a的作用域在函数内,this.a=window.a。所有输出为100 10 100;

    2.

    var a = 100;  
    function test(){  
        alert(a);  
        var a = 10;  
        alert(a);  
    }  
    test(); 

    声明提前后的代码为:

    var a = 100;  
    function test(){  
        var a;
        alert(a);  
        a = 10;  
        alert(a);  
    }  
    test(); 

    大坑(声明提前,赋值不提前)。默认值为undefined 所以正确答案为undefined 10

    3.

    var a = 100;    
    function test(){    
        alert(a);    
        a = 10;  //去掉了var 就变成定义了全局变量了  
        alert(a);    
    }    
    test();   
    alert(a);

    这个就很简单了。函数内调用全局变量a。 输出 100 10 10

    引申到函数。函数声明和函数表达式,

    function say(){
      //函数声明  提前
    }
    
    var say = function(){
      //函数表达式  声明提前但值不提前
    }

    example:

    say();//hi
    function say(){
      console.log('hi');  
    }
    say();//error
    var say = function(){
      console.log('hi');  
    }

    总结:

    1.函数内局部变量在函数执行完后就会销毁(闭包除外)

    2.函数内的this值向允许函数时的对象

    3.var声明提前;值不会提前

  • 相关阅读:
    <摘录>如何在64位linux强制编译32位应用程序
    Ubuntu安装Java
    Mybatis学习
    Java小工具Lombok
    jenkins忘记admin密码的处理方法
    list删除元素
    ConcurrentHashMap详解
    用户登录
    SpringDemo01
    SpringBoot Eclipse 热部署
  • 原文地址:https://www.cnblogs.com/kkform/p/8177861.html
Copyright © 2011-2022 走看看