摘要:只接受兩個(gè)參數(shù),且第二個(gè)參數(shù)必須是數(shù)組,這個(gè)數(shù)組代表原函數(shù)的參數(shù)列表。即繼承原函數(shù)的原型將這個(gè)新對(duì)象綁定到此函數(shù)的上。全局執(zhí)行環(huán)境執(zhí)行環(huán)境執(zhí)行環(huán)境閉包函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞。
提升
1 變量提升
console.log(a); var a = 1;
2 函數(shù)表達(dá)式
函數(shù)表達(dá)式的提升 === 變量提升
a(); var a = function(){...};
3 函數(shù)聲明
func(); function func(){ console.log(1); } var func = function(){ console.log(2); } func();
TEST
function func(){ a = 1; console.log(window.a); // ? console.log(a); // ? var a = 2; console.log(a); // ? } func();this
TEST
var people = { Name: "a", getName : function(){ console.log(this.Name); } }; var bar = people.getName; bar();
var people = { Name: "a", getName : function(){ console.log(this.Name); } }; people.getName();
1 默認(rèn)綁定
var name = "b"; var a = { name: "a", getName: function() { console.log(this.name); } } var obj = a.getName; obj(); // ?
2 隱性綁定
var name = "b"; var a = { name: "a", getName: function() { console.log(this.name); } } var obj = a.getName(); obj; // ?
3 強(qiáng)制綁定
call apply bind 區(qū)別
call從第二個(gè)參數(shù)開(kāi)始所有的參數(shù)都是 原函數(shù)的參數(shù)。
apply只接受兩個(gè)參數(shù),且第二個(gè)參數(shù)必須是數(shù)組,這個(gè)數(shù)組代表原函數(shù)的參數(shù)列表。
bind只有一個(gè)函數(shù),且不會(huì)立刻執(zhí)行,只是將一個(gè)值綁定到函數(shù)的this上,并將綁定好的函數(shù)返回。
var name = "b"; var a = { name: "a", getName: function() { console.log(this.name); } } a.getName.call(this);
var name = "b"; var a = { name: "a", getName: function() { console.log(this.name); } } var func = a.getName.bind(this); func();
4 New綁定
創(chuàng)建一個(gè)新對(duì)象。
把這個(gè)新對(duì)象的__proto__屬性指向原函數(shù)的prototype屬性。(即繼承原函數(shù)的原型)
將這個(gè)新對(duì)象綁定到 此函數(shù)的this上 。
返回新對(duì)象,如果這個(gè)函數(shù)沒(méi)有返回其他對(duì)象。
var name = "b"; function func() { this.name = "a"; console.log(this.name); } var obj = new func(); obj; // ?
5 箭頭函數(shù)
在定義時(shí)綁定this
this無(wú)法修改
var name = "b"; var people = { name: "a", getName : function() { return () => { console.log(this.name); } } }; var bar = people.getName(); bar();
TEST
function foo(arg){ this.a = arg; return this }; var a = foo(1); var b = foo(2); console.log(a.a); // ? console.log(b.a); // ?
var x = 1; var obj = { x: 2, f: function(){ console.log(this.x); } }; var bar = obj.f; var obj2 = { x: 3, f: obj.f } obj.f(); bar(); obj2.f();
function obj() { getName = function () { console.log (1); }; return this; } obj.getName = function () { console.log(2);}; obj.prototype.getName = function () { console.log(3);}; var getName = function () { console.log(4);}; function getName () { console.log(5);} obj.getName (); // ? getName (); // ? obj().getName (); // ? getName (); // ? new obj.getName (); // ? new obj().getName (); // ? new new obj().getName (); // ?執(zhí)行環(huán)境&作用域
變量、函數(shù)表達(dá)式——變量聲明,默認(rèn)賦值為undefined;
this——賦值;
函數(shù)聲明——賦值;
這三種數(shù)據(jù)的準(zhǔn)備情況我們稱之為“執(zhí)行上下文”或者“執(zhí)行上下文環(huán)境”。
作用域在函數(shù)定義時(shí)就已經(jīng)確定了。而不是在函數(shù)調(diào)用時(shí)確定。
var a = 10; function fn() { console.log(a); } function bar(f) { var a = 20; f() } bar(fn);
1 全局執(zhí)行環(huán)境
2 fn執(zhí)行環(huán)境
3 bar執(zhí)行環(huán)境
var a = 10; // 1 var b = 200; function fn() { var b = 20; function bar() { console.log(a + b); } bar(); // 3 } fn(); // 2
var a = 10; // 1 var b = 200; function fn() { var b = 20; function bar() { console.log(this.a + this.b); } bar(); // 3 } fn(); // 2閉包
函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞。
function fn () { var max = 10; return function bar(x) { if (x > max) { console.log(x); } } } var f1 = fn(); var max = 100; f1(15);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94420.html
摘要:理解執(zhí)行上下文和執(zhí)行堆棧對(duì)于理解的其它概念如提升,范圍和閉包至關(guān)重要。正確地理解執(zhí)行上下文和執(zhí)行堆棧將幫助你更好地使用開(kāi)發(fā)應(yīng)用。引擎執(zhí)行位于執(zhí)行堆棧頂部的方法。當(dāng)調(diào)用時(shí),為該函數(shù)創(chuàng)建一個(gè)新的執(zhí)行上下文,并且把它推入到當(dāng)前執(zhí)行堆棧。 By Sukhjinder Arora | Aug 28, 2018 原文 如果你是或者你想要成為一名js開(kāi)發(fā)者,那么你必須了解js程序內(nèi)部的運(yùn)作。理解執(zhí)行...
摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對(duì)象的縮寫(xiě)那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問(wèn)權(quán)限的變量和函數(shù)的有序訪問(wèn)。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對(duì)于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...
摘要:此時(shí)執(zhí)行環(huán)境棧中有兩個(gè)執(zhí)行環(huán)境,分別是全局執(zhí)行環(huán)境和函數(shù)執(zhí)行環(huán)境,的執(zhí)行環(huán)境在棧頂,全局執(zhí)行環(huán)境在棧的底部。所以執(zhí)行結(jié)果轉(zhuǎn)載 深入理解JS執(zhí)行細(xì)節(jié) Javascript從定義到執(zhí)行,JS引擎在實(shí)現(xiàn)層做了很多初始化工作,因此在學(xué)習(xí)JS引擎工作機(jī)制之前,我們需要引入幾個(gè)相關(guān)的概念:執(zhí)行環(huán)境棧、全局對(duì)象、執(zhí)行環(huán)境、變量對(duì)象、活動(dòng)對(duì)象、作用域和作用域鏈等,這些概念正是JS引擎工作的核心組件。這...
摘要:經(jīng)典面試題變量提升執(zhí)行環(huán)境作用域鏈今天記錄一個(gè)的經(jīng)典面試題,該編程題涉及到了的變量提升執(zhí)行環(huán)境作用域鏈問(wèn)題。這樣,一致延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。 js經(jīng)典面試題--變量提升、執(zhí)行環(huán)境、作用域鏈 今天記錄一個(gè)js的經(jīng)典面試題,該編程題涉及到了js的變量提升、執(zhí)行環(huán)境、作用域鏈問(wèn)題。 1、變量提升js沒(méi)有塊級(jí)作用域,使用var聲明的變量會(huì)自動(dòng)...
摘要:作用域鏈用于表明上下文的執(zhí)行順序。當(dāng)前上下文執(zhí)行完畢則出棧,執(zhí)行下一個(gè)上下文。 從一個(gè)簡(jiǎn)單的例子出發(fā) 先從一個(gè)簡(jiǎn)單的例子出發(fā)(先不涉及異步),看看自己是否大致了解瀏覽器的執(zhí)行機(jī)制: console.log(a); var a=1; function foo(a){ console.log(a); var a=2; console.log(a); } foo(a)...
閱讀 1057·2023-04-26 02:21
閱讀 2859·2021-09-24 09:47
閱讀 1652·2019-08-30 15:55
閱讀 2223·2019-08-30 14:01
閱讀 2383·2019-08-29 14:01
閱讀 2099·2019-08-29 12:46
閱讀 864·2019-08-26 13:27
閱讀 2005·2019-08-26 12:23