Javascript 为什么';这';是否在下面的代码段中引用窗口对象?
有人能帮我理解为什么下面的代码在splitName函数=[object Window]内部打印Javascript 为什么';这';是否在下面的代码段中引用窗口对象?,javascript,this,Javascript,This,有人能帮我理解为什么下面的代码在splitName函数=[object Window]内部打印 为什么“this”指的是窗口对象 让emp={ fName:“”, lName:“”, setName:函数(名称){ console.log(“内部setName函数=“+this”) 设splitName=函数(n){ console.log(“内部splitName函数=”+此) 设nameArr=n.split(“”); this.fName=nameArr[0]; this.lName=n
为什么“this”指的是窗口对象
让emp={
fName:“”,
lName:“”,
setName:函数(名称){
console.log(“内部setName函数=“+this”)
设splitName=函数(n){
console.log(“内部splitName函数=”+此)
设nameArr=n.split(“”);
this.fName=nameArr[0];
this.lName=nameArr[1];
}
姓名;
}
}
emp.setName(“ABC定义”);
console.log(window.fName)代码>可用于在中传递对象上下文
让emp={
fName:“”,
lName:“”,
setName:函数(名称){
console.log(“内部setName函数=“+this”)
设splitName=函数(n){
console.log(“内部splitName函数=”+此)
设nameArr=n.split(“”);
this.fName=nameArr[0];
this.lName=nameArr[1];
}
splitName.call(this,name);
}
}
emp.setName(“ABC定义”);
控制台日志(emp.fName)
我建议将您的方法splitName
更改为对象上的方法。通过这种方式,它将知道此
将引用您的对象emp
。否则,因为它是一个独立的函数,这意味着默认情况下,此
指的是窗口
,因为没有调用上下文
让emp={
fName:“”,
lName:“”,
splitName:函数(n){
console.log(“内部splitName函数=”+此)
设nameArr=n.split(“”);
this.fName=nameArr[0];
this.lName=nameArr[1];
},
setName:函数(名称){
console.log(“内部setName函数=“+this”)
此.splitName(名称);
}
}
emp.setName(“ABC定义”);
console.log(window.fName);
控制台日志(emp.fName)代码>将您的splitName函数声明更新为Arrow函数,然后它将以此作为其父函数的作用域,并按预期工作
您可以了解。
并了解
让emp={
fName:“”,
lName:“”,
setName:函数(名称){
console.log(“内部setName函数=“+this”)
让splitName=(n)=>{
console.log(“内部splitName函数=”+此)
设nameArr=n.split(“”);
this.fName=nameArr[0];
this.lName=nameArr[1];
}
姓名;
}
}
emp.setName(“ABC定义”);
console.log(emp.fName+“”+emp.lName);
console.log(window.fName)代码>,因为javascript中的上下文和词法范围以及执行上下文。在javascript中,每个函数(非箭头)都有执行上下文,而ES6箭头函数没有自己的执行上下文
对于构造函数,当我们使用new启动它们时,javascript引擎会为其创建执行上下文,并将其分配给它。但对于非构造函数函数,如果它们不是使用function.Call或function.Apply调用的,也就是说,由于词法作用域,它们得到的窗口作用域是最外部的作用域
在浏览器控制台中尝试console.log(this)
,这将打印窗口(因为它是DOM中的父对象或最外部的作用域)
也来看看。
您可以使用apply函数将内部函数的此部分绑定到封闭对象。这是因为在这种类型的闭包中,指的是窗口范围(全局范围)
因为splitName(name)
没有调用上下文也是因为它是在非严格模式下运行的,否则它将是未定义的
。Javascripts.call()和.apply()方法允许您设置函数的上下文。也可能是的重复。
let emp = {
fName: '',
lName: '',
setName: function(name) {
console.log("Inside setName function = " + this)
let splitName = function(n) {
console.log("Inside splitName function = " + this)
let nameArr = n.split(' ');
this.fName = nameArr[0];
this.lName = nameArr[1];
}
splitName.apply(emp,[name]);
}
}
emp.setName('ABC DEF');
console.log(window.fName);