1.關於this我看了不少文章windows
每次看都會有新發現,可是每次也老是忘記 此次我不想再忘記.app
http://www.javashuo.com/article/p-fyedrdrd-gg.html(參考文章)函數
this指向的是最終調用他的那個對象
改變this的指向問題:post
1.使用箭頭函數ui
2.使用_this = this(最經常使用的)this
var name ='window' var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { var _this = this; setTimeout( function() { _this.func1() },100); } }; a.func2() // Cherry
3.使用apply,call,bindspa
this指向的是他們的第一個參數prototype
# var a = { name : "Cherry",code
func1: function () { console.log(this.name) }, func2: function () { setTimeout( function () { this.func1() //}.apply(a),100); // 使用apply //}.call(a),100);//使用call }.bind(a)(),100; //使用bind } }; a.func2() // Cherry
4.new實例化一個對象對象
函數調用前使用的了new關鍵字,就是調用了構造函數.
在new實例化時,發生了什麼過程呢?
var a = new myFunction("Li","Cherry"); new myFunction{ var obj = {}; obj.__proto__ = myFunction.prototype; var result = myFunction.call(obj,"Li","Cherry"); return typeof result === 'obj'? result : obj; }
1.建立一個空對象 obj;
2.將新建立的空對象的隱式原型指向其構造函數的顯示原型。
3.使用 call 改變 this 的指向
4.若是無返回值或者返回一個非對象值,則將 obj 返回做爲新對象;若是返回值是一個新對象的話那麼直接直接返回該對象。
函數的調用方法:
1.做爲一個函數調用
var name = 'xixi' function a(){ var name = 'haha' console.log(this.name) //指向的是window } a() // xixi
就是一個函數,不屬於任何對象.
2.函數做爲方法調用
var name = "windowsName"; var a = { name: "Cherry", fn : function () { console.log(this.name); // Cherry } } a.fn();
這裏的a對象有一個屬性,有一個方法.a.fn() 即fn方法裏指向的是a對象
this永遠指向最後調用他的那個函數
3.使用構造函數調用方法
// 構造函數: function myFunction(arg1, arg2) { this.firstName = arg1; this.lastName = arg2; } // This creates a new object var a = new myFunction("Li","Cherry"); a.lastName; // 返回 "Cherry"
在實例化對象new時,就以及改變了this的指向
4.做爲函數方法調用函數
var name = "windowsName"; function fn() { var name = 'Cherry'; innerFunction(); function innerFunction() { console.log(this.name); // windowsName } } fn()
這個例子以及前面調用a.fun2()的例子,都是在函數方法裏面再調用方法的例子.
記住一些特殊的名詞,爲何本身 老是記不住呢?
只有這樣,才能夠更好的回答問題,就解決問題.