Javascript 如何从全局函数内部将属性指定给该函数

Javascript 如何从全局函数内部将属性指定给该函数,javascript,function,object,Javascript,Function,Object,假设javascript中的函数实际上是对象,如何在函数本身中为这个函数对象分配属性 由于“this”关键字指的是窗口对象,因此“prop”将被指定给窗口全局对象,而不是函数对象,因此下面的选项不起作用 function test() { this.prop = value; } 为什么全局函数中的“this”关键字指的是窗口对象而不是函数对象本身 编辑: 我的问题与重复的问题不同,因为我问的是如何将属性分配给该函数中的全局函数,而不是变量的范围。按名称引用函数: 功能测试(值){

假设javascript中的函数实际上是对象,如何在函数本身中为这个函数对象分配属性

由于“this”关键字指的是窗口对象,因此“prop”将被指定给窗口全局对象,而不是函数对象,因此下面的选项不起作用

function test() {
    this.prop = value;
}
为什么全局函数中的“this”关键字指的是窗口对象而不是函数对象本身

编辑:


我的问题与重复的问题不同,因为我问的是如何将属性分配给该函数中的全局函数,而不是变量的范围。

按名称引用函数:

功能测试(值){
test.prop=值;
}
测试(“你好”);

console.log(test.prop);//=>“hello”
简短回答:通过调用调用调用函数,并将预期的
this
作为第一个参数传递

功能测试(值){
this.prop=值
}
//'此'v值
测试呼叫(测试,10)
console.log(test.prop)//10
call
的目的是显式设置被调用函数的
this

说明:

对于非严格模式,当在没有调用方的情况下调用函数时,例如,
test(10)
隐式设置为全局对象,在本例中为
窗口
。在严格模式下,它将是
未定义的

function test() {
  return this
}

console.log(test()) // window (or undefined in strict mode)
在函数内部,
指函数的调用者

const caller = {
    test: function () { return this }
}

console.log(caller.test()) // caller, i.e., { test: function() {...} }
“类”也是如此(使用
new
调用函数)

根据您的用例,最好使用以下表单:

const myObj = {
  test: function(value) {
    this.prop = value
  }
}

// 'prop' will be set on `myObj` instead of the function.
myObj.test(10)
console.log(myObj) // { prop: 10, test: function(value) {...} }
或类构造:

function MyConstructor(value) {
  this.prop = value
}

const instance = new MyConstructor(10)
console.log(instance) // MyConstructor { prop: 10 }
console.log(instance.prop) // 10

我可以问一下你最终想要解决什么问题吗?你为什么要赋值的可能重复?为什么它会引用函数?使用
test
参考该功能。
this
关键字是指一个动态值,该值取决于函数的调用方式,在严格模式下通常是
未定义的
。其目的是为函数分配属性,以便稍后将此函数作为回调传递时使用。这些属性仅与函数的行为严格相关。虽然事实上是正确的,但这不是应该使用的。@Bergi,这是一个清晰而正确的答案,它直接根据用户问题的症结向用户提供解释,并用几个例子解释观察到的行为。我不会对他的使用做出任何价值判断。对应该使用什么的判断至少部分是主观的,并且取决于问题框架中未提供的细节。通过
call
设置调用者是完全足够的,实际上有助于在问题的上下文中演示
这个
的行为。我认为使用
call
不足以从函数本身内部引用函数-只是想给出主观否决其他罚款的原因回答得很好。非常感谢@Bergi的解释。干杯
function MyConstructor(value) {
  this.prop = value
}

const instance = new MyConstructor(10)
console.log(instance) // MyConstructor { prop: 10 }
console.log(instance.prop) // 10