最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript函數中this指向問題詳解

 更新時間:2021年05月07日 09:59:24   作者:一顆不甘墜落的流星  
這篇文章主要給大家介紹了關于JavaScript函數中this指向問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

this關鍵字

哪個對象調用函數,函數里面的this指向哪個對象。

**嚴格模式下:**在全局環(huán)境中,this指向的是undefined

**非嚴格模式下:**在全局環(huán)境中,this指向的是window

全局定義的函數直接調用,this => window

function fn(){
	console.log(this);
	// 此時 this 指向 window
}
fn();
// 相當于 window.fn()

對象內部的函數調用,this => 調用者

var obj = {
	fn:function(){
		console.log(this);
	}
}
obj.fn();
// 此時 this 指向 obj

定時器的處理函數,this => window

setTimeout(function(){
	console.log(this);	
},0)
// 此時定時器處理函數里面的this 指向 window

事件處理函數,this => 事件源

div.onclick = function(){
	console.log(this);
}
//當你點擊 div 的時候,this指向 div

自調用函數,this => window

(function () {
  console.log(this)
})()
// 此時 this 指向 window

改變 this 指向

剛才我們說過的都是函數的基本調用方式里面的 this 指向,我們還有三個方法可以忽略函數本身的 this 指向轉而指向別的地方。這三個方法就是 call / apply / bind,是強行改變 this 指向的方法。

  • call/apply/bind附加在函數調用后面使用,可以忽略函數本身的 this 指向
  • call和apply使用時會立即自動調用函數,bind使用時會創(chuàng)建一個函數,但是需要另外去手動調用

call

語法:fn.call(fn 函數體內 this 的指向哪里,arg1, arg2, ...);

作用:調用被綁定的函數fn,指定它的 this 指向并傳參

參數:

  • 第一個參數:是 this 指向
  • 其余的參數:需要傳入的值,可以是多個,用逗號隔開

使用 call 方法不傳參

var num = 666;

function fn() {
  console.log('num = ', this.num);
}

fn.call();  // num = 666

使用 call 方法指定this

var name = 'Rose';
var obj = {name:'Jack'};
function fn(){
	console.log(this.name);
}
fn();	// Rose
fn.call();	// Rose
fn.call(obj);  // jack

使用 call 方法指定this并傳參

var name = 'Rack';
var obj = {name:'Jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.call(obj,1,2);	// obj 1 2
fn(1,3);	// window 1 3

apply

apply方法接受的是一個包含多個參數的數組

語法:fn.apply(fn 函數體內 this 的指向哪里,[arg1, arg2, ...]);

作用:調用被綁定的函數fn,指定它的 this 指向并傳參

參數:

  • 第一個參數:this 指向的對象
  • 第二個參數:一個包含多個參數的數組
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.apply(obj,[1,2]);	// obj 1 2

使用 apply 合并數組

使用push將元素追加到數組中,如果參數是數組,它會將該數組作為單個元素添加,而不是將這個數組內的每個元素添加進去,因此我們最終會得到一個數組內的數組

var arr1 = [1,2];
var arr2 = [3,4];
arr1.push(arr2);
console.log(arr1);	//	[1,2,[3,4]]	

concat雖然可以合并數組,但它并不是將元素添加到現有數組,而是創(chuàng)建并返回一個新數組。

var arr1 = [1,2];
var arr2 = [3,4];

var arr3 = arr1.concat(arr2);
console.log(arr1);	// [1,2]
console.log(arr3);	// [1,2,3,4]

如果我們要將元素追加到現有數組又該怎么做?循環(huán)?No!這是apply就派上用場了

var arr1 = [1,2];
var arr2 = [3,4];

arr1.push.apply(arr1,arr2);
console.log(arr1);	// [1,2,3,4]

使用 apply 與內置函數連用

/* 找出數組中最大/小的數字 */
var numbers = [5, 6, 2, 3, 7];

var max = Math.max(numbers)
var min = Math.min(numbers)
console.log(min,max);	// NaN NaN

var max = Math.max.apply(null, numbers); 
/* 基本等同于 Math.max(numbers[0], ...) 或 Math.max(5, 6, ..) */
var min = Math.min.apply(null, numbers);
console.log(min,max);	// 2 7

bind

語法:fn.bind(fn 函數體內 this 的指向, arg1, arg2, ...);

作用:創(chuàng)建一個新的綁定函數,指定它的 this 指向并傳參,必須調用它才會被執(zhí)行

參數:

  • 第一個參數:this 指向的對象
  • 其余的參數:需要傳入的值,可以是多個,用逗號隔開
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.bind(obj,1,2);	// 未調用不執(zhí)行
fn.bind(obj,1,3)()	// obj 1 3
var newFn = fn.bind(obj,3,4);
newFn();	// obj 1 4
newFn(5,6);	// obj 3 4

總結

到此這篇關于JavaScript函數中this指向問題的文章就介紹到這了,更多相關JavaScript函數this指向內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 簡單談談JavaScript變量提升

    簡單談談JavaScript變量提升

    對于學習JavaScript的初學者來說,變量提升是繞不過去的一個知識點,簡單來說變量提升就是 JS會把var變量的聲明自動提升到作用域的頂部,這篇文章主要給大家介紹了關于JavaScript變量提升的相關資料,需要的朋友可以參考下
    2021-09-09
  • javascript數組遍歷的方法實例分析

    javascript數組遍歷的方法實例分析

    這篇文章主要介紹了javascript數組遍歷的方法,結合實例形式分析了javascript數組遍歷及相關的some、every、filter、map等方法的使用技巧,需要的朋友可以參考下
    2016-09-09
  • 淺析JavaScript如何解決跨域問題并手寫一個jsonp

    淺析JavaScript如何解決跨域問題并手寫一個jsonp

    跨域是指瀏覽器為了安全性,實施的同源策略,同源策略要求,只有協(xié)議、域名和端口號完全相同的網頁,才能共享資源,本文整理了一些常用的跨域解決方法,希望對大家有所幫助
    2024-03-03
  • js操作模態(tài)窗口及父子窗口間相互傳值示例

    js操作模態(tài)窗口及父子窗口間相互傳值示例

    這篇文章主要介紹了js操作模態(tài)窗口及父子窗口間相互傳值,需要的朋友可以參考下
    2014-06-06
  • pace.js頁面加載進度條插件

    pace.js頁面加載進度條插件

    在頁面中引入 Pace.js 和您所選擇主題的 CSS 文件,就可以讓你的頁面擁有漂亮的加載進度和 Ajax 導航效果。不需要掛接到任何代碼,自動檢測進展。您可以選擇顏色和多種效果,有簡約,閃光燈,MAC OSX,左側填充,頂部填充,計數器和彈跳等等。
    2015-09-09
  • javascript?ES6中set集合、map集合使用方法詳解與源碼實例

    javascript?ES6中set集合、map集合使用方法詳解與源碼實例

    這篇文章主要介紹了javascript?ES6中set、map使用方法詳解與源碼實例,需要的朋友可以參考下
    2022-12-12
  • JS變量及其作用域

    JS變量及其作用域

    本文主要介紹了JS變量及其作用域的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • 淺談javascript對象模型和function對象

    淺談javascript對象模型和function對象

    這篇文章主要簡單介紹了javascript對象模型和function對象,以及相關的示例代碼,非常實用,需要的小伙伴參考下
    2014-12-12
  • 卡拉 OK 字幕效果

    卡拉 OK 字幕效果

    卡拉 OK 字幕效果...
    2006-08-08
  • JavaScript實現對下拉列表值進行排序的方法

    JavaScript實現對下拉列表值進行排序的方法

    這篇文章主要介紹了JavaScript實現對下拉列表值進行排序的方法,實例分析了javascript對下拉列表元素的遍歷與排序實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

浏阳市| 治多县| 岳普湖县| 水城县| 肃北| 昭平县| 澳门| 博湖县| 邵东县| 永平县| 万州区| 郧西县| 塘沽区| 凌海市| 广饶县| 瑞丽市| 武威市| 桂阳县| 庆元县| 太和县| 海阳市| 大丰市| 呼和浩特市| 开平市| 孟津县| 威海市| 郯城县| 关岭| 安宁市| 赫章县| 成武县| 炉霍县| 扶绥县| 蒙城县| 海林市| 广河县| 泌阳县| 安吉县| 南岸区| 拉萨市| 遵化市|