资讯专栏INFORMATION COLUMN

JS '严格模式'

sunnyxd / 1829人阅读

摘要:一篇简单的探索,这个严格模式出来很早了,很多人都有写过,而且官方文档很详细。

原文链接:乖小鬼的简书

为什么想到写这么一篇文章呢,来源在于回答一个 SG上面的问题。那么问题是这样子的。

var a = 2; 
function foo(){ console.log(this.a);}
foo();

以上代码,执行的结果是什么??

如果你回答是2,那么对了多少?

只能说对了一半,为什么呢? 其实是题主的问法有问题,他没有规定环境,所以答案很多,
直接在浏览器里面如下写法执行

 

确实会输出2,没有问题。

但是如果在 nodejs里面, 大家考虑过么?

结果是可能是2,可能是 undefined。 现在有人是不是蒙圈了,不知道为什么。那么解析的文章在

http://f2e.souche.com/blog/a-js-problem-about-global/

甚至还有后续,可以看 sg上的原问题,

http://segmentfault.com/q/1010000004053433?_ea=473968

在评论中讨论到了一个问题,如果在浏览器中使用 ‘严格模式’, 会怎么样?

 

结果就是会报错,错误如下,是不是出乎大家的意料,

  Uncaught TypeError: Cannot read property "a" of undefined(…)

那么为什么呢? 我们打印下 this 关键字看看, 发现是 undefined。 我操,这跟我们的想法不符合啊,为何不是window这个全局变量了?? 这一切的原因在于 "use strict"

那么什么是严格模式,mozile的官方文档解释在这里
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript

主要注意点在 “Changes in strict mode” 这个栏目下,“ Securing JavaScript” 第一条

First, the value passed as this to a function in strict mode is not forced into being an object (a.k.a. "boxed"). For a normal function, this is always an object: either the provided object if called with an object-valued this; the value, boxed, if called with a Boolean, string, or number this; or the global object if called with an undefined or null this. (Use call, [apply
](https://developer.mozilla.org/en-US/Web/JavaScript/Reference/Global_Objects/Function/apply), or [bind
](https://developer.mozilla.org/en-US/Web/JavaScript/Reference/Global_Objects/Function/bind) to specify a particularthis
.) Not only is automatic boxing a performance cost, but exposing the global object in browsers is a security hazard, because the global object provides access to functionality that "secure" JavaScript environments must restrict. Thus for a strict mode function, the specified this is not boxed into an object, and if unspecified, this will be undefined:

  "use strict";function fun() { return this; }
  console.assert(fun() === undefined);
  console.assert(fun.call(2) === 2);
  console.assert(fun.apply(null) === null);
  console.assert(fun.call(undefined) === undefined);
  console.assert(fun.bind(true)() === true);

意思就是不会在默认的给function指定一个this对象了。 一般情况下,我们的function一定会有一个调用对象,不管是字符还是数组什么的,或者是全局变量,这种转换很损耗性能,而且危险,因为暴露了全局对象,所以严格模式下,不会再封装this对象了,如果没有,就是 undefined。

以上就是我们执行出来,报错的原因。至于这个模式到底好不好呢? 其实有些争议的,很多人写js已经习惯了这些各种变化,或者说是为方便吧,但是很多刚开始写的人很不习惯,甚至搞不明白,仁者见仁智者见智吧。

一篇简单的探索,这个严格模式 出来很早了,很多人都有写过,而且官方文档很详细。当然更关键的是你不使用也没有任何问题,一旦使用就要注意了哦。

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

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

相关文章

  • 《You Don't Know JS》阅读理解——作用域

    摘要:在我们的程序中有很多变量标识符,我们现在或者将来将使用它。当我们使用时,如果并没有找到这个变量,在非严格模式下,程序会默认帮我们在全局创建一个变量。词法作用域也就是说,变量的作用域就是他声明的时候的作用域。 作用域 定义 首先我们来想想作用域是用来干什么的。在我们的程序中有很多变量(标识符identifier),我们现在或者将来将使用它。那么多变量,我咋知道我有没有声明或者定义过他呢,...

    codeKK 评论0 收藏0
  • 《You Don't Know JS》阅读理解——this

    摘要:运行规则根据的运作原理,我们可以看到,的值和调用栈通过哪些函数的调用运行到调用当前函数的过程以及如何被调用有关。 1. this的诞生 假设我们有一个speak函数,通过this的运行机制,当使用不同的方法调用它时,我们可以灵活的输出不同的name。 var me = {name: me}; function speak() { console.log(this.name); }...

    tianren124 评论0 收藏0
  • the deadline of JavaScript's this

    摘要:在用处千千万,基于自己研究和认识,今天做一个了断。可以取所属对象的上下文的方法称为公共方法,可以使属性,方法变成公开的属性方法在构造函数,方法中用到。内部函数调用的时候,只能搜索到其活动对象为止,不可能直接访问外部函数中的变量。 this this在JavaScript用处千千万,基于自己研究和认识,今天做一个了断。 全局,匿名函数调用 对象方法调用 闭包总指向上一级 构造函数中,指...

    chinafgj 评论0 收藏0
  • 读书笔记(you don't know js): this的理解(没写完...)

    摘要:基本概念首先,函数不能存储的值,指向哪里,取决于调用它的对象。如果没有这个对象,那默认就是调用非严格模式下。也就是说是在运行的时候定义的,不是在绑定的时候定义的。 基本概念 首先,函数不能存储this的值,this指向哪里,取决于调用它的对象。如果没有这个对象,那默认就是window调用(非严格模式下)。也就是说this是在运行的时候定义的,不是在绑定的时候定义的。 funct...

    freewolf 评论0 收藏0

发表评论

0条评论

sunnyxd

|高级讲师

TA的文章

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