zoukankan      html  css  js  c++  java
  • javascript小记-作用域

    一、全局作用域

    全局作用域的变量不论在什么时候都可以直接引用,而不必通过全局对象;
    满足以下条件的变量属于全局作用域:
    1、在最外层定义的变量
    2、全局对象的属性
    3、任何地方隐式定义的变量(未定义直接赋值的变量)

    注意:在任何地方隐式定义的变量,都会定义在全局变量中,即不通过var声明直接赋值的变量
    而模块化编程的一个重要原则是避免试用全局变量,所以在任何地方,都不应该隐式定义。

    二、局部作用域(函数作用域)

    在一个函数中定义的变量只对这个函数可见,称为函数作用域(局部作用域)

    javascript在搜索变量的作用域时,会先搜索当前函数作用域,如果没有找到则搜索其上层作用域,一直到全局作用域。
    例如:

     1     var v1='v1';
     2     var f1=function(){
     3         console.log(v1);
     4     }
     5     f1();//输出 v1
     6 
     7     var f2=function(){
     8         var v2='v2';
     9         console.log(v2);
    10     }
    11     f2();//输出 v2

    再看一个例子:

    1     var scope='global';
    2     var f=function(){
    3         console.log(scope);
    4         var scope='f';
    5     }
    6     f();//输出 undefined

    可以这样理解:
    在 console.log 函数访问 scope 变量时,JavaScript 会先搜索函数 f 的作用域,恰巧在 f 作用域里面搜索到 scope 变量,
    所以上层作用域中定义的 scope 就被屏蔽了,但执行到 console.log 语句时,scope 还没被定义,或者说初始化,所以得到的就是 undefined 值了

    我们还可以从另一个角度来理解:对于开发者来说,在访问未定义的变量或定义了但没有初始化的变量时,获得的值都是 undefined。
    于是我们可以认为,无论在函数内什么地方定义的变量,在一进入函数时就被定义了,但直到 var 所在的那一行它才被初始化,
    所以在这之前引用到的都是 undefined 值。(事实上,JavaScript 的内部实现并不是这样,未定义变量和值为 undefined 的变量还是有区别的。)

    三、函数作用域的嵌套

     1     var scope = 'top';
     2     var f1 = function() {
     3         console.log(scope);
     4     };
     5     f1(); // 输出 top
     6     
     7     var f2 = function() {
     8         var scope = 'f2';
     9         f1();
    10     };
    11     f2(); // 输出 top

    这个例子中,通过 f2 调用的 f1 在查找 scope 定义时,找到的是父作用域中定义的 scope 变量,
    而不是 f2 中定义的 scope 变量。这说明了作用域的嵌套关系不是在调用时确定的,而是在定义时确定的。

    所以,函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就是说,
    JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可以在语法分析时确定,而不必等到运行时确定

  • 相关阅读:
    六角星的创建
    即时音效
    扭动的软糖
    shaderutil的用法
    openGL es2.0 创建纹理灯光球
    雾的简单实现
    Python中的文件和目录操作实现代码
    [py] SyntaxError: invalid syntax
    【ssh】在使用ssh项目ContextLoaderListener 找不到。
    【jdbc】JDBC中Statement与PreparedStatement的区别
  • 原文地址:https://www.cnblogs.com/fanfan259/p/3514003.html
Copyright © 2011-2022 走看看