this规则:函数在运行时,看有没有调用者, 如果没有则指向window
一、普通函数
var length = 10;
function test() {
console.log(this.length) // this.length ===> window.length
}
test(); // 10
二、对象中的this的指向
var length = 10;
function test() {
console.log(this.length)
}
var obj = {
length: 100,
action: test,
};
obj.action() // 100, 有调用者,调用者为obj
var f = obj.action;
f(); // this指向window // 10 没有调用者,指向window
三、扩展题(重点)
var length = 10;
function test() {
console.log(this.length)
}
var arr = [test, 2, 3, 4];
arr[0](); // 4, 有调用者,调用者是arr
四、arguments 参数集合 类似于数组
// 阿里面试题
var length = 10;
function test() {
console.log(this.length)
}
var obj = {
length: 100,
action: function(test) {
test(); // 10 前面没有调用者 默认指向window
arguments[0]() // arguments相当于传过来的参数[test, 1, [2, 3], 4]
// 数组一是test 相当于[test, 1, [2, 3], 4]调用 数组的length是4
}
}
obj.action(test, 1, [2, 3], 4); //10 4
上面arguments[0]()为什么是4:
我们先看一下对象, obj.a、obj['a']就是获取对象里面的a属性的值,调用者是obj,同理数组也是一个对象,它原型链最后也是指向object的,arr[0]就跟上面对象obj['a']一样,所以a[0]的调用者是arr, 同理 arguments[0]相当于调用者是传过来的[test, 1, [2, 3], 4],所以指向[test, 1, [2, 3], 4], [test, 1, [2, 3], 4]的长度为4