亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS '嚴(yán)格模式'

sunnyxd / 2054人閱讀

摘要:一篇簡(jiǎn)單的探索,這個(gè)嚴(yán)格模式出來(lái)很早了,很多人都有寫過(guò),而且官方文檔很詳細(xì)。

原文鏈接:乖小鬼的簡(jiǎn)書

為什么想到寫這么一篇文章呢,來(lái)源在于回答一個(gè) SG上面的問(wèn)題。那么問(wèn)題是這樣子的。

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

以上代碼,執(zhí)行的結(jié)果是什么??

如果你回答是2,那么對(duì)了多少?

只能說(shuō)對(duì)了一半,為什么呢? 其實(shí)是題主的問(wèn)法有問(wèn)題,他沒(méi)有規(guī)定環(huán)境,所以答案很多,
直接在瀏覽器里面如下寫法執(zhí)行

 

確實(shí)會(huì)輸出2,沒(méi)有問(wèn)題。

但是如果在 nodejs里面, 大家考慮過(guò)么?

結(jié)果是可能是2,可能是 undefined。 現(xiàn)在有人是不是蒙圈了,不知道為什么。那么解析的文章在

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

甚至還有后續(xù),可以看 sg上的原問(wèn)題,

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

在評(píng)論中討論到了一個(gè)問(wèn)題,如果在瀏覽器中使用 ‘嚴(yán)格模式’, 會(huì)怎么樣?

 

結(jié)果就是會(huì)報(bào)錯(cuò),錯(cuò)誤如下,是不是出乎大家的意料,

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

那么為什么呢? 我們打印下 this 關(guān)鍵字看看, 發(fā)現(xiàn)是 undefined。 我操,這跟我們的想法不符合啊,為何不是window這個(gè)全局變量了?? 這一切的原因在于 "use strict"

那么什么是嚴(yán)格模式,mozile的官方文檔解釋在這里
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript

主要注意點(diǎn)在 “Changes in strict mode” 這個(gè)欄目下,“ 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);

意思就是不會(huì)在默認(rèn)的給function指定一個(gè)this對(duì)象了。 一般情況下,我們的function一定會(huì)有一個(gè)調(diào)用對(duì)象,不管是字符還是數(shù)組什么的,或者是全局變量,這種轉(zhuǎn)換很損耗性能,而且危險(xiǎn),因?yàn)楸┞读巳謱?duì)象,所以嚴(yán)格模式下,不會(huì)再封裝this對(duì)象了,如果沒(méi)有,就是 undefined。

以上就是我們執(zhí)行出來(lái),報(bào)錯(cuò)的原因。至于這個(gè)模式到底好不好呢? 其實(shí)有些爭(zhēng)議的,很多人寫js已經(jīng)習(xí)慣了這些各種變化,或者說(shuō)是為方便吧,但是很多剛開始寫的人很不習(xí)慣,甚至搞不明白,仁者見仁智者見智吧。

一篇簡(jiǎn)單的探索,這個(gè)嚴(yán)格模式 出來(lái)很早了,很多人都有寫過(guò),而且官方文檔很詳細(xì)。當(dāng)然更關(guān)鍵的是你不使用也沒(méi)有任何問(wèn)題,一旦使用就要注意了哦。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/78285.html

相關(guān)文章

  • 《You Don't Know JS》閱讀理解——作用域

    摘要:在我們的程序中有很多變量標(biāo)識(shí)符,我們現(xiàn)在或者將來(lái)將使用它。當(dāng)我們使用時(shí),如果并沒(méi)有找到這個(gè)變量,在非嚴(yán)格模式下,程序會(huì)默認(rèn)幫我們?cè)谌謩?chuàng)建一個(gè)變量。詞法作用域也就是說(shuō),變量的作用域就是他聲明的時(shí)候的作用域。 作用域 定義 首先我們來(lái)想想作用域是用來(lái)干什么的。在我們的程序中有很多變量(標(biāo)識(shí)符identifier),我們現(xiàn)在或者將來(lái)將使用它。那么多變量,我咋知道我有沒(méi)有聲明或者定義過(guò)他呢,...

    codeKK 評(píng)論0 收藏0
  • 《You Don't Know JS》閱讀理解——this

    摘要:運(yùn)行規(guī)則根據(jù)的運(yùn)作原理,我們可以看到,的值和調(diào)用棧通過(guò)哪些函數(shù)的調(diào)用運(yùn)行到調(diào)用當(dāng)前函數(shù)的過(guò)程以及如何被調(diào)用有關(guān)。 1. this的誕生 假設(shè)我們有一個(gè)speak函數(shù),通過(guò)this的運(yùn)行機(jī)制,當(dāng)使用不同的方法調(diào)用它時(shí),我們可以靈活的輸出不同的name。 var me = {name: me}; function speak() { console.log(this.name); }...

    tianren124 評(píng)論0 收藏0
  • the deadline of JavaScript's this

    摘要:在用處千千萬(wàn),基于自己研究和認(rèn)識(shí),今天做一個(gè)了斷。可以取所屬對(duì)象的上下文的方法稱為公共方法,可以使屬性,方法變成公開的屬性方法在構(gòu)造函數(shù),方法中用到。內(nèi)部函數(shù)調(diào)用的時(shí)候,只能搜索到其活動(dòng)對(duì)象為止,不可能直接訪問(wèn)外部函數(shù)中的變量。 this this在JavaScript用處千千萬(wàn),基于自己研究和認(rèn)識(shí),今天做一個(gè)了斷。 全局,匿名函數(shù)調(diào)用 對(duì)象方法調(diào)用 閉包總指向上一級(jí) 構(gòu)造函數(shù)中,指...

    chinafgj 評(píng)論0 收藏0
  • 讀書筆記(you don't know js): this的理解(沒(méi)寫完...)

    摘要:基本概念首先,函數(shù)不能存儲(chǔ)的值,指向哪里,取決于調(diào)用它的對(duì)象。如果沒(méi)有這個(gè)對(duì)象,那默認(rèn)就是調(diào)用非嚴(yán)格模式下。也就是說(shuō)是在運(yùn)行的時(shí)候定義的,不是在綁定的時(shí)候定義的。 基本概念 首先,函數(shù)不能存儲(chǔ)this的值,this指向哪里,取決于調(diào)用它的對(duì)象。如果沒(méi)有這個(gè)對(duì)象,那默認(rèn)就是window調(diào)用(非嚴(yán)格模式下)。也就是說(shuō)this是在運(yùn)行的時(shí)候定義的,不是在綁定的時(shí)候定義的。 funct...

    freewolf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

sunnyxd

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<