能帮我解释下为什么this指向window
function fn(){
console.log(this)
};
原理
兄弟你少了步调用的过程吧? 我们在写的时候一般是简写,正规的写法你比如 alert也是window的一个属性,应该写成 window.alert 正如这个函数 这个函数在调用的时候就是 window.fn(), 只不过我们一般写成了 fn()直接调用而已,也就是说是window调用的所以this指向window, 记住谁调用的this就指向谁 就ok了
在你所给出的条件下,this
不一定指向window
this
的指向取决于fn
(函数)的调用方式,归纳而言,javascript
中的函数调用方式有三种。
这里先声明一个函数。
function fn(){
console.log(this);
}
第一种,最常见,作为一个对象的属性被调用,这时的this
指向调用它的对象。
var obj = {
go: fn
}
obj.go(); // this指向obj
fn(); //这种方式实际也是对象调用的方式
// 浏览器环境下等价于
window.fn(); // this 指向 window
// nodejs环境下等价于
global.fn() // this 指向 global
第二种,new关键字的方式调用,this指向新创建的对象实例(该对象的__proto__
指向fn.prototype
),这种方式稍微复杂一点,你可以查看一下参考文档。
new fn();
第三种,call和apply的方式调用,this
可以自己指定。
var obj2 = {
name: 'segmentfault'
}
fn.call(obj2); // this指向obj2
这个属于bom和dom内容
一两句说不清楚
我建议系统学习一下js基础知识(BOM DOM ECMAScript)
https://pan.baidu.com/s/1hqwt0R6
this对象在运行的时候是基于函数执行的环境绑定的:在全局环境中this等于window,而函数被作为某个对象的方法调用时,this等于那个对象。
function fn(){
alert(this)
};
fn();//相当于window.fn(),this指向window
var obj = {};
obj.fn2 = fn;
obj.fn2();//this指向obj
在js中,除了使用箭头函数的写法时this指向的是当前函数执行函数的格式化上下文,剩下的都是在函数执行的过程中确定的。楼主提问的问题好像少了调用吧。
如果楼主想问的是这样:
function fn(){
console.log(this)
};
fn()
那么实际上fn函数被调用的函数环境是全局的,也就是window环境。
在实际调用时候是window.fn()。所以此时指向的是window对象
1.fn();
直接调用函数,这种调用模式不管在哪声明在哪个作用域调用,函数都是由window调用,所以this都指向window
var age = 38;
var obj = {
age: 18,
getAge:function () {
console.log(this.age);// 18
function foo(){
console.log(this.age);// 38
}
foo();//直接调用,指向window
}
}
obj.getAge(); //方法调用,指向调用它的对象
2.作为方法obj.fn(),这种模式指向调用该方法的对象
var fn = function(){
console.log(this.length);
}
var arr = [fn, 1, 2];
arr[0](); // 打印3
3.构造函数模式,this指向new出来的对象
function Person(){
console.log(this);
}
var p = new Person();
4.上下文模式 call() apply() bind()
this指向你传递的第一个参数,没有传递参数或者是null,undefined,this指向为window
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决