摘要:一篇簡單的探索,這個嚴格模式出來很早了,很多人都有寫過,而且官方文檔很詳細。
原文鏈接:乖小鬼的簡書
為什么想到寫這么一篇文章呢,來源在于回答一個 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已經習慣了這些各種變化,或者說是為方便吧,但是很多剛開始寫的人很不習慣,甚至搞不明白,仁者見仁智者見智吧。
一篇簡單的探索,這個嚴格模式 出來很早了,很多人都有寫過,而且官方文檔很詳細。當然更關鍵的是你不使用也沒有任何問題,一旦使用就要注意了哦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78285.html
摘要:在我們的程序中有很多變量標識符,我們現在或者將來將使用它。當我們使用時,如果并沒有找到這個變量,在非嚴格模式下,程序會默認幫我們在全局創建一個變量。詞法作用域也就是說,變量的作用域就是他聲明的時候的作用域。 作用域 定義 首先我們來想想作用域是用來干什么的。在我們的程序中有很多變量(標識符identifier),我們現在或者將來將使用它。那么多變量,我咋知道我有沒有聲明或者定義過他呢,...
摘要:運行規則根據的運作原理,我們可以看到,的值和調用棧通過哪些函數的調用運行到調用當前函數的過程以及如何被調用有關。 1. this的誕生 假設我們有一個speak函數,通過this的運行機制,當使用不同的方法調用它時,我們可以靈活的輸出不同的name。 var me = {name: me}; function speak() { console.log(this.name); }...
摘要:在用處千千萬,基于自己研究和認識,今天做一個了斷。可以取所屬對象的上下文的方法稱為公共方法,可以使屬性,方法變成公開的屬性方法在構造函數,方法中用到。內部函數調用的時候,只能搜索到其活動對象為止,不可能直接訪問外部函數中的變量。 this this在JavaScript用處千千萬,基于自己研究和認識,今天做一個了斷。 全局,匿名函數調用 對象方法調用 閉包總指向上一級 構造函數中,指...
摘要:基本概念首先,函數不能存儲的值,指向哪里,取決于調用它的對象。如果沒有這個對象,那默認就是調用非嚴格模式下。也就是說是在運行的時候定義的,不是在綁定的時候定義的。 基本概念 首先,函數不能存儲this的值,this指向哪里,取決于調用它的對象。如果沒有這個對象,那默認就是window調用(非嚴格模式下)。也就是說this是在運行的時候定義的,不是在綁定的時候定義的。 funct...
閱讀 3490·2019-08-30 15:53
閱讀 3406·2019-08-29 16:54
閱讀 2190·2019-08-29 16:41
閱讀 2397·2019-08-23 16:10
閱讀 3377·2019-08-23 15:04
閱讀 1342·2019-08-23 13:58
閱讀 347·2019-08-23 11:40
閱讀 2452·2019-08-23 10:26