有关this的两道问题

本文深入探讨JavaScript中this关键字的行为及其与作用域的关系,解释了不同上下文中this的指向,包括全局作用域、对象方法调用、构造函数及原型链中的表现。并通过实例展示了作用域链和闭包的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.var length=10;
function fn(){
console.log(this.length);
}
var obj = {
length:5,
method: function (fn) {
fn();
arguments[0]();
}
};
obj.method(fn);
obj.method(fn, 123);

打印的结果是10 1 10 1
分析:这里的obj.method(fn);,将一个函数传入进来, 执行fn()的时候对象变成了全局变量,所以 console.log(this.length)的时候就打印出了全局变量10。 arguments 的对象是arguments对象,arguments[0]指的是mathod函数的第一个对象,即fn,然后执行fn(),所以 console.log(this.length)时
,this就是method的函数的参数的个数

2.function Foo() {
getName = function () {
console.log('1');
};
return this;
}
Foo.getName = function () {
console.log('2');
};
Foo.prototype.getName = function () {
console.log('3');
};
var getName = function () {
console.log('4');
};
function getName() {
console.log(5);
}

Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

这个题的结果是:2 4 1 1 2 3 3

(1)Foo.getName直接有,不会再去进行加载,所以打印出来的是2;

(2)getName有两个,零级作用域上有两个函数,一个是Foo,一个是getName,由于现在一个是函数表达式,一个是函数声明,函数声明将会提升,然后函数表达式会将其覆盖,所以window上的getNameN函数,最终为var getName = function () {
console.log('4');
};所以打印出4

(3)先执行Foo,将里面隐式的全局函数getName释放,然后返回window对象,所以打印出1,同时将原来零级作用域上的getName函数覆盖。

(4)打印getName函数,此时的window对象上的getName函数已经覆盖为 getName = function () {
console.log('1');
};,所以打印出1;

(5)new( Foo.getName()) Foo不是函数,所以先执行Foo.getName(),打印出2;

(6)(new Foo()).getName(); Foo是函数,所以先执行new Foo(),找到原型对象,然后再执行getName(),即执行的是Foo.prototype.getName = function () {
console.log('3');
};,所以打印出来为3;

(7)new((new Foo()).getName())和上一题(6)类似,这里打印出3,然后new 3

转载于:https://www.cnblogs.com/Catherine001/p/7284513.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值