资讯专栏INFORMATION COLUMN

javascript 声明前置与作用域 ( hoisting& Scoping)

mmy123456 / 2813人阅读

摘要:特别注意的是不用声明的变量那么他归所有也就是全局作用域所有。如果到达全局作用域但是这个变量仍未找到,则会抛出异常。语句结束后,作用域链恢复正常。

1.javascript不管是变量(or 叫变量表达式?或者变量的声明与赋值吧 var scope="loacal")的声明还是函数(or 函数表达式)的声明,都遵循命名在当前作用域前置(提升到当前命名空间顶端)函数体保留在原地。
var scope="global";//全局变量
function text(){
    console.log(scope);//输出为undefined
    var scope="local";
    console.log(scope);//输出为local
}
text();

而上面的代码等价于

var scope;
scope="global"
function text(){
   var scope;         //命名前置
   console.log(scope);//输出为undefined
   scope="local";
   console.log(scope);//输出为local
}
text();

换成函数

text1();
function text1(){//函数的声明
    alert(1);//弹出1
}
text2();
var text2=function(){//函数表达式
    alert(1);//undefined is not a function
}
//上面的函数表达式声明等价于
var text3;//声明前置
text3();
text3=function(){//函数体留在原地
    alert(1);
}
2.javascript只有函数级作用域没有块级作用域。
var name="golbar";
if(true){
    var name="local";
    console.log(name);//输出local
}
console.log(name);//也输出local

如果存在块级作用域那么第一个值为local第二个值为golbar。
块级作用域指的是能用for if while 等代码块形成的独立作用域,即为块级作用域。
特别注意的是不用var 声明的变量那么他归window所有也就是全局作用域所有。
每次引用一个变量,JavaScript 会向上遍历整个作用域直到找到这个变量为止。如果到达全局作用域但是这个变量仍未找到,则会抛出 ReferenceError 异常。

function text(){
    log="in function";
    console.log(log);
};
text();
console.log(window.log)//都输出为 in function

还有个就是作用域链:一个函数体重嵌套了多层函数体,并在不同的函数体中定义了同一个变量,当其中一个函数访问这个变量时,变会形成一条作用域链 scope chain

chain="window";
function one(){
    var chain="one";
    function two(){
        var chain="two";
        console.log(chain);
    };
    function three(){
        console.log(chain);
    };
    two();
    three();
};
one();             //two one 
console.log(chain);// window

作用域链有个特殊情况就是with语句:JS中的with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。with语句结束后,作用域链恢复正常。

chain="window";
function one(){
    var chain="one";
     function two(obj){
         console.log(chain);//输出为one
         with(obj){
         console.log(chain)//输出为obj
         }
     }
     var obj={chain:"obj"};
     two(obj);
}
one();   

还有就是编写代码的时候虽然JS可以不用;或者相直接 if(true) return; 但尽量不要这样写。至于为什么的话以后会写。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86554.html

相关文章

  • [翻译] JavaScript Scoping and Hoisting

    摘要:对于新手来说是最令人困惑的部分之一。函数声明通过的形式。很明显的,语言自身定义和函数形参已经处于作用域顶端。这就意味着,函数声明比变量声明具有更高的优先级。但是这却不意味着对这个名称的赋值无效,仅仅是声明的部分会被忽略而已。 原文链接:JavaScript Scoping and Hoisting 你知道下面的JavaScript代码执行后会alert出什么值吗? var foo = ...

    FingerLiu 评论0 收藏0
  • 理解 JavaScript(二)

    摘要:所以形式参数是本地的,不是外部的或者全局的。这叫做函数声明,函数声明会连通命名和函数体一起被提升至作用域顶部。这叫做函数表达式,函数表达式只有命名会被提升,定义的函数体则不会。 Scoping & Hoisting var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; ...

    luxixing 评论0 收藏0
  • JS基础篇--函数声明定义,作用,函数声明表达式的区别

    摘要:在中,有四种方式可以让命名进入到作用域中按优先级语言定义的命名比如或者,它们在所有作用域内都有效且优先级最高,所以在任何地方你都不能把变量命名为之类的,这样是没有意义的形式参数函数定义时声明的形式参数会作为变量被至该函数的作用域内。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...

    TerryCai 评论0 收藏0
  • JavaScript中的变量提升、作用

    摘要:即的变量提升此处变量未声明时便可以使用,其实是因为会自动将声明语句提升到顶部。但名字的初始化却是按其在代码中书写的顺序进行的,不受以上优先级的影响。 变量提升(hoisting) 在JavaScript中,函数、变量的声明都会被提升(hoisting)到该函数或变量所在的scope的顶部。即——JavaScript的变量提升. var x = 5; alert(x); ...

    wwq0327 评论0 收藏0
  • es6必会之let && const

    摘要:副作用,无副作用可执行和关键词。和不能像一样同一个下声明多次和不会像一样变量声明提升原因是,存在因此不能,赋值前使用变量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 关键词: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...

    ygyooo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<