资讯专栏INFORMATION COLUMN

作用域链&&严格模式

CloudDeveloper / 812人阅读

摘要:作用域链迷惑性代码不假思索的想到出书的一定是啊,然而结结实实被打脸,输出原因在编译时,全局作用域中会存有的对象作用域中存的无在运行时,我这里需要变量啊,但是在的作用域中并不存在,那么就需要去全局作用域中寻找报告老大找到了,输出全局作用域中的

作用域链

迷惑性代码

var a = 100;
function test(){
    console.log(a);
}
function testFun(){
    var a = 200;
    test();
}

不假思索的想到 出书的一定是 200啊 ,然而结结实实被打脸,输出 100

原因

在编译时,

全局作用域中会存有的对象

a

test

testFun

testFun作用域中存的

a

test

在运行时,

test() 我这里需要变量a 啊,但是在test的作用域中并不存在,那么就需要去全局作用域中寻找 a,报告老大找到了,输出全局作用域中的a,输出100

迷惑性代码

var a = 100;
function testFun2(){
    var a = 300;
    function test(){
        console.log(a)
    }
    test();
}
testFun2();

输出什么? 300!

?!为什么呢

作用域链再走一波

1.全局作用域

a

testFun2

testFun2

a

test

test

运行时test时,报告老大,我需要变量a ,test作用域:我没有啊,你去看看testFun2有没有;
testFun2作用域:我有 给你拿去好了;
输出 300

严格模式

实例

"use strict";
x = 3.14; //  报错(x 未定义)
"use strict"
myFunction();
function myFunction(){
    y = 3.14;  //  报错 (y 未定义)
}
// 不允许删除变量或对象
"use strict";
var x = 3.14;
delete x ;
// 不允许删除函数
"use strict";
function x(p1,p2){};
delete x ;
//  报错
// 不允许变量重名
"use strict";
function x(p1,p1){} //  报错 
// 不允许使用八进制

"use strict";
var x = 010;   // 报错
// 不允许使用转义字符
"use strict";
var x= 10;   // 报错
//  不允许对只读属性赋值
"use strict";
var obj ={};
Object.defineProperty(obj,"x",{value:0,writable:false});
obj.x = 3.14;
// 不允许对一个使用 getter方法读取的属性进行赋值
"use strict";
var obj ={get x(){return 0}};
obj.x=3.14; //  报错
// 变量名 不能使用 "eval"字符串
"use strict";
var eval = 3.14; //  报错
//变量名不能使用 "arguments"字符串
"use strict";
var arguments = 3.14;  //报错
// 禁止 this 关键字指向全局对象

function test(){
    console.log(this); // undefined
}
严格模式新增的一些保留关键字

implements

interface

let

package

private

protected

public

static

yield

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

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

相关文章

  • ES6精华:Let & Const

    摘要:所以,最终极的办法是一层一层冻结所有对象。块级作用域使呈现出块级作用域的特征。声明的变量仅存在于当前块级作用域中。在中,严格模式下等价于使用声明,非严格下等价于使用。在中使用声明的变量,为了保持程序的严谨性,不允许被访问。 let和const都是声明变量的新方式。 一般的,由于这两种声明方式的特性,现在项目组的开发规范中都会要求:不使用var而是let或const。 Const co...

    UnixAgain 评论0 收藏0
  • 温故js系列(14)-闭包&垃圾回收&内存泄露&闭包应用&作用域链&

    摘要:该对象包含了函数的所有局部变量命名参数参数集合以及,然后此对象会被推入作用域链的前端。如果整个作用域链上都无法找到,则返回。此时的作用域链包含了两个对象的活动对象和对象。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:闭包 JavaScript-闭包 闭包(closure)是一个让人又爱又恨的somet...

    Amio 评论0 收藏0
  • 详解Javascript的作用域、作用域链以及闭包

      一、我们先说说javascript的作用域  ①全局变量-函数体外部进行声明  ②局部变量-函数体内部进行声明  1)函数级作用域  javascript语言中局部变量不同于C#、Java等高级语言,在这些高级语言内部,采用的块级作用域中会声明新的变量,这些变量不会影响到外部作用域。  而javascript则采用的是函数级作用域,也就是说js创建作用域的单位是函数。  例如:  在C#当中我...

    3403771864 评论0 收藏0
  • javascript 声明前置与作用域 ( hoisting& Scoping)

    摘要:特别注意的是不用声明的变量那么他归所有也就是全局作用域所有。如果到达全局作用域但是这个变量仍未找到,则会抛出异常。语句结束后,作用域链恢复正常。 1.javascript不管是变量(or 叫变量表达式?或者变量的声明与赋值吧 var scope=loacal)的声明还是函数(or 函数表达式)的声明,都遵循命名在当前作用域前置(提升到当前命名空间顶端)函数体保留在原地。 var sco...

    mmy123456 评论0 收藏0
  • 【Step-By-Step】一周面试题 && 答案汇总 / 01

    摘要:构造函数返回值是或,这种情况下指向的是返回的对象。并执行了构造函数中的方法如果函数没有返回其他对象,那么指向这个新对象,否则指向构造函数中返回的对象。对于文档来说应当是唯一的。的值意味着其不可能是基本数据类型。 关于【Step-By-Step】 不积跬步无以至千里。 Step-By-Step (点击进入项目) 是我于 2019-05-20 开始的一个项目,项目愿景:一步一个脚印,量变引...

    xiaolinbang 评论0 收藏0

发表评论

0条评论

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