Javascript 为什么';这';是否在下面的代码段中引用窗口对象?

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

有人能帮我理解为什么下面的代码在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=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);