Closed xccjk closed 2 years ago
先说结论:
this永远指向最后调用它的那个对象
this永远指向最后调用它的那个对象
this永远指向最后调用它的那个对象
var name = 'globalName'
function fn() {
console.log(this.name)
}
fn() // globalName
我们发现,最后调用fn的位置就是fn()
,前面没有对象。在非严格模式下,调用对象就是全局对象window.fn()
。在严格模式下,会抛出错误。
var name = 'globalName'
var obj = {
name: 'xcc',
fn: function() {
console.log(this.name)
}
}
obj.fn() // 'xcc'
在这个例子中, 会发现函数fn
是对象obj
调用的,所以this指向obj
var name = 'globalName'
var obj = {
name: 'xcc',
fn: function() {
console.log(this.name)
}
}
window.obj.fn() // 'xcc'
在这个例子中,会发现结果还是xcc,因为this指向永远只与最后调用它的那个对象有关,不管对象obj前面有多少对象,都与函数fn中的this指向没关系
var name = 'globalName'
var obj = {
fn: function() {
console.log(this.name)
}
}
obj.fn() // undefined
还是可以发现,this还是指向最后调用它的那个对象obj,obj中没有定义name属性,因此结果为undefined
下面看一个存在坑的例子
var name = 'globalName'
var obj = {
name: 'xcc',
fn: function() {
console.log(this.name)
}
}
var f = obj.fn
f() // 'globalName'
看到这个例子,发现为什么不是打印xcc呢,因为在声明var f = obj.fn
时并没有发生调用,而是以window.f()
调用的,因此this会指向window
var name = 'globalName'
var obj = {
name: 'xcc',
fn: function() {
console.log(this.name)
}
}
var f = obj.fn() // 'xcc'
会发现在声明var f = obj.fn()
时直接调用了obj.fn()
,因此this会指向obj
var name = 'globalName'
function fn() {
var name = 'xcc'
fn1()
function fn1() {
console.log(this.name)
}
}
fn() // 'globalName'
这个例子中,函数fn中的fn1在调用时,前面并没有对象
作为函数方法调用函数时:
在 JavaScript 中, 函数是对象。 JavaScript 函数有它的属性和方法。call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身 在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。
因此函数fn1在非严格模式下等价于window.fn1()
浅谈JavaScript中call与apply的模拟实现
call
call()方法是使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法
语法:
demo:
注意事项:
模拟实现
第一步:
试想当调用call时,把foo对象改造如下:
带来的问题,给foo函数引入了对于的属性bar
解决方式:通过delete方法删除多余属性
模拟步骤分为下面几部:
等价于下面流程:
实现方式:
第二步
给定call函数执行时添加参数执行
注意事项:
apply
apply()方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数
语法:
demo:
实现方式
参考资料