這篇文章主要介紹了javascript中this屬性,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
this總是回傳一個物件,也就是傳回屬性或方法目前所在的對象。
物件的屬性可以賦給另一個對象,所以屬性所在的目前物件是可變的,也就是this的指向是可變的。
eg:
var A = { name : '张三', describe : function(){ return '姓名:' + this.name; } }; var B = { name : '李四' } B.describe = A.describe; B.describe();
結果:「姓名:李四」
再看一個例子:
var A = { name : '张三', describe : function(){ return '姓名:' + this.name; } }; var name = '李四' f = A.describe; f();
結果也是“姓名:李四”,因為這時this指向f執行階段所在的物件-頂層window
this的使用場合
##1、全域環境——無論this是不是在函數內部,只要是在全域環境下運行,this就是指頂層物件window2、建構函數——指的是實例物件eg:var Obj = function(p){ this.p = p; } Obj.prototype.a = function(){ return this.p; } var obj = new Obj('color'); obj.a(); obj.p;
var obj = { foo : function(){ console.log(this); } }; obj.foo();//obj
this使用注意點
1、避免多層thisvar o = { f1 : function(){ console.log(this); var f2 = function(){ console.log(this); }(); } } o.f1();
var temp = function(){ console.log(this); }; var o = { f1 : function(){ console.log(this); var f2 = temp(); } } o.f1();
var o = { f1 : function(){ console.log(this); var that = this; var f2 = function(){ console.log(that); }(); } } o.f1();
var o = { v : 'hello', p : ['a1','a2'], f : function(){ this.p.forEach(function(item){ console.log(this.v + ' ' + item); }); } } o.f();
var o = { v : 'hello', p : ['a1','a2'], f : function(){ var that = this; this.p.forEach(function(item){ console.log(that.v + ' ' + item); }); } } o.f();
var o = { v : 'hello', p : ['a1','a2'], f : function(){ this.p.forEach(function(item){ console.log(this.v + ' ' + item); },this); } } o.f();
var o = new Object(); o.f = function(){ console.log(this === o); } o.f();//true $("#button").on("click",o.f);//false
#綁定this的方法
JavaScript提供了call、apply、 bind三個方法來切換/固定this的指向function.prototype.call()
函數實例的call方法可以指定函數執行時this所在的作用域,call方法的參數量個對象,如果參數為空、null、undefined,則預設傳入全域對象。如果call的參數不是對象,那麼就會自動包裝成包裝對象。 func.call(thisValue,arg1,arg2,……)var n = 123; var obj = {n : 456}; function a(){ console.log(this.n); } a.call();//123 a.call(null);//123 a.call(undefined);//123 a.call(window);//123 a.call(obj);//456
var obj = {}; //原生方法 obj.hasOwnProperty('toString');//false //覆盖了原生的方法 obj.hasOwnProperty = function(){ return true; } obj.hasOwnProperty('toString');//true //调回原生的方法 Object.prototype.hasOwnProperty.call(obj,'toString');//false
function.prototype.apply()
apply與call唯一的區別是apply接受一個數組作為函數執行時的參數,func.apply(thisValue,[arg1,arg2,……])apply的應用之一-找出陣列的最大元素var a = [10,3,4,2]; Math.max.apply(null,a);
?
var a = ['a','','b']; function print(i){ console.log(i); } a.forEach(print);//a b Array.apply(null,a).forEach(print);//a undefined b
Array.prototype.slice.apply({0:1,length:1});
var o = new Object(); o.f = function(){ console.log(this === o); } var f = function(){ o.f.apply(o);//或o.f.call(o); } $("#button").on("click",f);
var d = new Date(); d.getTime(); var print = d.getTime; print();//Uncaught TypeError: this is not a Date object.
var print = d.getTime.bind(d);
var add = function(x,y){ return x * this.m + y * this.n; } var obj = { m:2, n:2 } var newAdd = add.bind(obj,5);//绑定add的第一个参数x newAdd(5);//第二个参数y
if(!('bind' in Function.prototype)){ Function.prototype.bind = function(){ var fn = this; var context = arguments[0]; var args = Array.prototype.slice.call(arguments,1); return function(){ return fn.apply(context,args); } } }
以上是詳解javascript中this屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!