1.默認系結: 獨立函式呼叫
- 案列一
function foo() {
console.log(this)
}
foo() //指向window
- 案列二
var obj = {
name: "why",
foo: function() {
console.log(this)
}
}
var bar = obj.foo
bar() // 指向window
- 案列三
function foo1() {
console.log(this)
}
function foo2() {
console.log(this)
foo1()
}
function foo3() {
console.log(this)
foo2()
}
foo3() //也是指向window
- 案列四
function foo() {
console.log(this)
}
var obj = {
name: "why",
foo: foo
}
var bar = obj.foo
bar() // window
2.obj物件呼叫指向呼叫的該物件
- 案列一
var obj = {
name: "why",
foo: foo
}
obj.foo() // obj物件
- 案例二
var obj = {
name: "why",
eating: function () {
console.log(this.name + "在吃東西")
},
running: function () {
console.log(obj.name + "在跑步")
}
}
obj.eating() //obj
obj.running() //obj
var fn = obj.eating
fn() //window
//列印結果
why在吃東西
why在跑步
undefined在吃東西
- 案例三
var obj1 = {
name: "obj1",
foo: function () {
console.log(this)
}
}
var obj2 = {
name: "obj2",
bar: obj1.foo
}
obj2.bar() //obj2
3.顯示系結apply,call,bind
1.foo直接呼叫和call/apply呼叫的不同在于this系結的不同
foo直接呼叫指向的是全域物件(window)
call/apply是可以指定this的系結物件
function foo() {
console.log("函式被呼叫了", this)
}
foo() //window
var obj = {
name: "obj"
}
foo.call(obj) //函式被呼叫了 { name: 'obj' }
foo.apply(obj) //函式被呼叫了 { name: 'obj' }
foo.apply("aaaa") //函式被呼叫了 [String: 'aaaa']
2.call和apply有什么區別?
兩者在傳參的時候 apply的引數是需要放到陣列里面的 而call的直接,寫下去
function sum(num1, num2, num3) {
console.log(num1 + num2 + num3, this)
}
sum.call("call", 20, 30, 40) //
sum.apply("apply", [20, 30, 40])
3.bind bind方法會回傳一個新的函式
默認系結和顯示系結bind沖突: 優先級(顯示系結)
function foo() {
console.log(this)
}
var newFoo = foo.bind("aaa")
newFoo() //aaa
4.new系結
我們通過一個new關鍵字呼叫一個函式時(構造器), 這個時候this是在呼叫這個構造器時創建出來的物件
this = 創建出來的物件
這個系結程序就是new 系結
function Person(name, age) {
this.name = name
this.age = age
}
var p1 = new Person("why", 18)
console.log(p1.name, p1.age) // why 18
var p2 = new Person("kobe", 30)
console.log(p2.name, p2.age) //kobe 30
var obj = {
foo: function() {
console.log(this)
}
}
來源coderwhy老師
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/413456.html
標籤:其他
上一篇:獲取陣列中最接近值的索引
