一道关于javascript指针的题目,求详细的解答分析。
var length = 10;
function fn(){
alert(this.length)
}
var obj = {
length: 5,
method: function(fn){
fn() // ?
arguments[0]() // ?
}
}
obj.method(fn)
一道关于javascript指针的题目,求详细的解答分析。
var length = 10;
function fn(){
alert(this.length)
}
var obj = {
length: 5,
method: function(fn){
fn() // ?
arguments[0]() // ?
}
}
obj.method(fn)
var length = 10;
function fn(){
alert(this.length)
}
var obj = {
length: 5,
method: function(fn){
fn() // 10 指向 window
arguments[0]() // 1 指向 arguments
}
}
obj.method(fn)
第一个问题:fn()
指向这个知识点:
任意函数里如果嵌套了 非箭头函数,那这个时候 嵌套函数里的 this 在未指定的情况下,应该指向的是 window 对象
第二个问题:arguments[0]()
指向这个知识点:
在方法调用(如果某个对象的属性是函数,这个属性就叫方法,调用这个属性,就叫方法调用)中,执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内 this 的指向。(通俗的说,调用谁的方法 this 就指向谁;)
这个地方,可能会让人迷惑,arguments[0]
指向 fn
,所以 arguments[0]()
是作为 arguments
对象的属性[0]
来调用 fn
的,所以 fn
中的 this
指向属性访问主体的对象 arguments
;
举个例子:
[function fn(){alert(this.length)}][0]()//1
数组也是对象,只不过数组对象的整型属性会计入 length
属性中,并被区别对待,这里就是调用数组对象的0
属性,函数作为数组对象的属性调用,函数中的this
当然指向这个数组,所以返回数组的length
,当然是 1;
其他详情戳js 中 this 的指向问题
如果直接把这段代码放在html里面的script标签里面,length就是全局变量了,可以在windows下面看到length。
var length = 10;
function fn(){
alert(this.length)
}
var obj = {
length: 5,
method: function(fn){
fn() // 这里输出的是你定义的windows下面全局变量length 10
arguments[0]() // 这里arguments的length为1,而fn 里面的this指向arguments,所以输出1.
}
}
第一个直接调用fn,this指向window。第二个arguments[0](),相当于一个对象调用自身的某个属性函数(类似obj.fn(),fn函数中的this会指向obj。),所以第二个this指向arguments。
我感觉fn()
你应该是会的,函数的直接调用。
arguments[0]()
可以看下这个。
var obj = {
fn: function () {console.log(this)}
1: function () {console.log(this)}
}
obj.fn()
obj[1]()
// 这俩调用没什么区别,都是对象方法的调用,arguments[0]()同理
这有问题??
第一个fn()this指向win win对象的length属性并没有定义值,所以返回undefined,第二个this指向argumengts对象,因为fn作为一个参数存储在arg对象里,argumengts的长度为1
正确答案是:
undefined
1
第一个好理解,function
在没有绑定this
前,都指向window
对象。
第二个,必须理解arguments
这个参数。指的是function
的所有实参,与形参无关。也就是调用函数时,实际传入的参数,以对象形式存在:{"0": "", "1": ""}
,本题中的值为:{ '0': [Function: fn] }
。那么arguments[0]
就是[Function: fn]
,当调用arguments[0]()
时,this
指向的是arguments
对象,相当于调用了arguments.length
,所以值为1
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
3 回答1.3k 阅读✓ 已解决
这样会清楚一点。第一个
fn()
由于没有对象上下文,所以直接调用fn()
时其this
指向的是全局的window
或process
,所以打印出来的length
是全局的,也就是10
。第二个arguments[0]()
则有了对象上下文arguments
,此时其this
指向arguments
,从而打印出来的length
其实是arguments.length
,即为1
,