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

    首先看一个例子:

    function Foo() {

        getName = function () { alert (1); };

        return this;

    }
    Foo中的getName理解为变量,它没有var声明, 所以先向当前Foo函数作用域内寻找getName变量,没有。
    再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量。
    是一个从里到外寻找变量的过程, 会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中var一个getName变量(全局变量)。
     
     
    先贴上几个例子的代码截图,方便从基础理解之
     
     
     
     
    JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。
    1 'use strict';
    2 
    3 function foo() {
    4     var x = 'Hello, ' + y;
    5     alert(x);
    6     var y = 'Bob';
    7 }
    8 
    9 foo();

    对于上述foo()函数,JavaScript引擎看到的代码相当于:

    function foo() {
        var y; // 提升变量y的申明
        var x = 'Hello, ' + y;
        alert(x);
        y = 'Bob';
    }

    var y = 'Bob';拆分为了 var y ;y='Bob';所以y的值为undefined
    所以为了避免各种怪异事件的发生,最好在函数开头声明需要的变量;
    function foo() {
        var
            x = 1, // x初始化为1
            y = x + 1, // y初始化为2
            z, i; // z和i为undefined
        // 其他语句:
        for (i=0; i<100; i++) {
            ...
        }
    }
     
    JavaScript默认有一个全局对象window
    直接访问全局变量a和访问window.a是完全一样的
     
    'use strict';
    
    function foo() {
        for (var i=0; i<100; i++) {
            //
        }
        i += 100; // 仍然可以引用变量i
    }

    为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量
    'use strict';
    
    function foo() {
        for (var i=0; i<100; i++) {
            //
        }
        i += 100; // 仍然可以引用变量i
    }
     
  • 相关阅读:
    [BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)
    .NET中的PublicKeyToken以及强命名问题
    bug统计分析续(一)基于SQL的Bug统计方法
    iOS项目开发实战——通过Http Get方式与server通信
    TCP与UDP的区别(转)
    Telit GPRS模块测试报告
    GPRS优点介绍及GPRS上网相关知识(转)
    MC34063中文资料及应用实例(转)
    MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
    Bluez SPP实现代码分析(转)
  • 原文地址:https://www.cnblogs.com/huazhenghao/p/5295168.html
Copyright © 2011-2022 走看看