摘要:原文鏈接猛戳這里構造函數下面生成實例這時和會自動含有一個屬性,指向它們的構造函數。這個對象的所有屬性和方法,都會被構造函數的實例繼承。
JavaScript的嚴格模式和正常模式
"use strict";
顧名思義也就是 JavaScript 會在所謂嚴格模式下執行,其一個主要的優勢在于能夠強制開發者避免使用未聲明的變量。對于老版本的瀏覽器或者執行引擎則會自動忽略該指令。
在正常模式中,如果一個變量沒有聲明就賦值,默認是全局變量。嚴格模式禁止這種用法,全局變量必須顯式聲明。
"use strict"; v = 1; // 報錯,v未聲明 for(i = 0; i < 2; i++) { // 報錯,i未聲明 }
因此,嚴格模式下,變量都必須先用var命令聲明,然后再使用。
Javascript語言的一個特點,就是允許"動態綁定",即某些屬性和方法到底屬于哪一個對象,不是在編譯時確定的,而是在運行時(runtime)確定的。
嚴格模式對動態綁定做了一些限制。某些情況下,只允許靜態綁定。也就是說,屬性和方法到底歸屬哪個對象,在編譯階段就確定。這樣做有利于編譯效率的提高,也使得代碼更容易閱讀,更少出現意外。
因為下面的代碼不是在嚴格模式下執行,并且this的值不會在函數執行時被設置,此時的this的值會默認設置為全局對象。
function f2(){ "use strict"; // 這里是嚴格模式 return this; } f2() === undefined; // true
更全面的信息參考這個鏈接
JavaScript作用域和變量提升考慮下面程序的運行結果
var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar();
結果是10;
再看下面這個
var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a);
結果是1
出乎意料的結果是由于“Hoisting (變量提升)”的原因,要理解其中的原理需要先了解下JavaScript的作用域scope。
javascript作用域(函數作用域)與C語言作用域(塊級作用域)不同
int main() { int x = 1; printf("%d, ", x); // 1 if (1) { int x = 2; printf("%d, ", x); // 2 } printf("%d ", x); // 1 }
這是因為C家族的語言有塊作用域,當程序控制走進一個塊,比如if塊,只作用于該塊的變量可以被聲明,而不會影響塊外面的作用域。但是在Javascript里面,這樣不行
var x = 1; console.log(x); // 1 if (true) { var x = 2; console.log(x); // 2 } console.log(x); // 2
函數聲明和變量聲明總是會被解釋器悄悄地被“提升”到方法體的最頂部。這個意思是,像下面的代碼:
function foo() { bar(); var x = 1; }
實際上會被解釋成:
function foo() { var x; bar(); x = 1; }
無論定義該變量的塊是否能被執行。下面的兩個函數實際上是一回事:
function foo() { if (false) { var x = 1; } return; var y = 1; } function foo() { var x, y; if (false) { x = 1; } return; y = 1; }
只有函數式的聲明才會連同函數體一起被提升。foo的聲明會被提升,但是它指向的函數體只會在執行的時候才被賦值
function test() { foo(); // TypeError "foo is not a function" bar(); // "this will run!" var foo = function () { // 變量指向函數表達式 alert("this won"t run!"); } function bar() { // 函數聲明 函數名為bar alert("this will run!"); } } test();
如果程序員不能很好的理解變量提升,他們寫的程序就容易出現一些問題。
為了避免這些問題,通常我們在每個作用域開始前聲明這些變量,這也是正常的 JavaScript 解析步驟,易于我們理解。
JavaScript 嚴格模式(strict mode)不允許使用未聲明的變量。
原文鏈接猛戳這里
JavaScript Object-Oriented JavaScript構造函數function Person (name,age) { this.name = name; this.age = age; this.type = "human"; this.play = function(){console.log("video game")}; } //下面生成實例 var Person1 = new Person("Tom",25); var Person2 = new Person("Jack",26); alert(Person1.name); //這時Person1和Person2會自動含有一個constructor屬性,指向它們的構造函數。 alert(Person1.constructor); //Javascript還提供了一個instanceof運算符,驗證原型對象與實例對象之間的關系 alert(Person1 instanceof Person); //true alert(Person1.type == Person2.type);//ture alert(Person1.play == Person2.play);//false
type屬性和play()方法都是一模一樣的內容,每一次生成一個實例,都必須為重復的內容,多占用一些內存.
Prototype模式Javascript規定,每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。
這意味著,我們可以把那些不變的屬性和方法,直接定義在prototype對象上.
function Person (name,age) { this.name = name; this.age = age; } Person.prototype.type = "human"; Person.prototype.play = function(){console.log("video game")}; var Person1 = new Person("Tom",25); var Person2 = new Person("Jack",26); alert(Person1.type); //human alert(Person1.play == Person2.play); //true
這時所有實例的type屬性和play()方法,其實都是同一個內存地址,指向prototype對象,使用原型的好處是可以讓對象實例共享它所包含的屬性和方法,因此就提高了運行效率。
在JavaScript中,一共有兩種類型的值,原始值和對象值。每個對象都有一個內部屬性 prototype ,我們通常稱之為原型。原型的值可以是一個對象,也可以是null。如果它的值是一個對象,則這個對象也一定有自己的原型。這樣就形成了一條線性的鏈,我們稱之為原型鏈。
關于原型、原型鏈-猛戳
ECMAScript 有 5 種原始類型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
原始數據類型
引用類型通常叫做類(class),也就是說,遇到引用值,所處理的就是對象。
Object 對象
Object 對象自身用處不大,不過在了解其他類之前,還是應該了解它。因為 ECMAScript 中的 Object 對象與 Java 中的 java.lang.Object 相似,ECMAScript 中的所有對象都由這個對象繼承而來,Object 對象中的所有屬性和方法都會出現在其他對象中,所以理解了 Object 對象,就可以更好地理解其他對象。
Object 對象具有下列屬性
constructor
對創建對象的函數的引用(指針)。對于 Object 對象,該指針指向原始的 Object() 函數。
Prototype
對該對象的對象原型的引用。對于所有的對象,它默認返回 Object 對象的一個實例。
所有程序設計語言最重要的特征之一是具有進行類型轉換的能力。
ECMAScript 給開發者提供了大量簡單的類型轉換方法。
toString()
parseInt()
parseFloat()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84401.html
摘要:注意目前發現有其他人以團隊名義進行招聘,發出的郵箱皆為私人郵箱。為防止在投遞簡歷出現誤會,在此提醒各位注意團隊沒有以任何個人名義或郵箱進行招聘。的面試過程我們一般會有輪面試,對于高級別的工程師可能會有輪面試。 fex-team/interview-questions 注意 目前發現有其他人以 FEX 團隊名義進行招聘,發出的郵箱皆為私人郵箱。 為防止在投遞簡歷出現誤會,在此提醒各位注意...
摘要:注意目前發現有其他人以團隊名義進行招聘,發出的郵箱皆為私人郵箱。為防止在投遞簡歷出現誤會,在此提醒各位注意團隊沒有以任何個人名義或郵箱進行招聘。的面試過程我們一般會有輪面試,對于高級別的工程師可能會有輪面試。 fex-team/interview-questions 注意 目前發現有其他人以 FEX 團隊名義進行招聘,發出的郵箱皆為私人郵箱。 為防止在投遞簡歷出現誤會,在此提醒各位注意...
摘要:注意目前發現有其他人以團隊名義進行招聘,發出的郵箱皆為私人郵箱。為防止在投遞簡歷出現誤會,在此提醒各位注意團隊沒有以任何個人名義或郵箱進行招聘。的面試過程我們一般會有輪面試,對于高級別的工程師可能會有輪面試。 fex-team/interview-questions 注意 目前發現有其他人以 FEX 團隊名義進行招聘,發出的郵箱皆為私人郵箱。 為防止在投遞簡歷出現誤會,在此提醒各位注意...
摘要:計算數組的極值微信面試題獲取元素的最終前端掘金一題目用代碼求出頁面上一個元素的最終的,不考慮瀏覽器,不考慮元素情況。 Excuse me?這個前端面試在搞事! - 前端 - 掘金金三銀四搞事季,前端這個近年的熱門領域,搞事氣氛特別強烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個搞事 boy 轉述一下。 以下是我一個朋友的故事,真的不是我。 ... ja...
摘要:筆者作為一位,將工作以來用到的各種優秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識點大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計算數組的極值技巧使你的更加專業前端掘金一個幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會用到。會持續更新… 一、...
閱讀 992·2023-04-25 14:20
閱讀 1868·2021-11-24 10:20
閱讀 3766·2021-11-11 16:55
閱讀 2905·2021-10-14 09:42
閱讀 3467·2019-08-30 15:56
閱讀 1144·2019-08-30 15:55
閱讀 1063·2019-08-30 15:44
閱讀 771·2019-08-29 11:28