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
    }
     
  • 相关阅读:
    Ajax基础1
    jQuery框架源码解读
    关于struts、spring 和 hibernate的说明
    struts2学习笔记(一)
    NodeJS+MongoDB
    最佳实践(二)
    ajax请求web容器控制超时
    实战经验
    javascript学习笔记(二)
    spring学习笔记(六)
  • 原文地址:https://www.cnblogs.com/huazhenghao/p/5295168.html
Copyright © 2011-2022 走看看