Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么本例中原型函数的执行上下文(“this”)是错误的?_Javascript_Node.js_This_Anonymous Function - Fatal编程技术网

Javascript 为什么本例中原型函数的执行上下文(“this”)是错误的?

Javascript 为什么本例中原型函数的执行上下文(“this”)是错误的?,javascript,node.js,this,anonymous-function,Javascript,Node.js,This,Anonymous Function,原型函数bar在Node.js环境中的其他位置执行(应该可以使用)。我希望这个内部bar()函数成为我的对象的实例: var Foo = function (arg) { this.arg = arg; Foo.prototype.bar.bind(this); }; Foo.prototype.bar = function () { console.log(this); // Not my object! console.log(this.arg); //

原型函数
bar
在Node.js环境中的其他位置执行(应该可以使用)。我希望
这个
内部
bar()
函数成为我的对象的实例

var Foo = function (arg) {
    this.arg = arg;

    Foo.prototype.bar.bind(this);
};

Foo.prototype.bar = function () {
    console.log(this); // Not my object!
    console.log(this.arg); // ... thus this is undefined
}

var foo = new Foo();
module.execute('action', foo.bar); // foo.bar is the callback 
。。。为什么
bar()?为什么执行上下文没有被
bind
调用更改?

返回一个值-新绑定的函数-但您只是放弃该值
Function.bind
不会改变
this
(即其调用上下文),也不会改变其参数(
this

还有其他方法可以得到同样的结果吗

在构造函数内部执行它实际上是错误的,因为
bar
存在于
Foo.prototype
上,所以将它绑定到
Foo
的任何一个实例都会破坏所有其他
Foo.bar
调用的
!按你的意思绑定:

或者——可能更简单——根本不在原型上定义
bar

var Foo = function (arg) {
    this.arg = arg;

    function bar () {
        console.log(this);
        console.log(this.arg);
    }

    this.bar = bar.bind(this);
};

var foo = new Foo();
module.execute('action', foo.bar);

也就是说,我需要分配返回值?还有其他方法可以得到同样的结果吗?我不喜欢重新分配函数的想法…我会花一些时间完全理解你的答案,同时。。。真的谢谢你!除了Matt所说的,每次调用
Foo
时,您都将绑定一个不同的
this
。如果将函数调用为
foo.bar
,那么为什么要使用
bind
?另外,
这个
不是“上下文”,它是函数的一个特殊值,是它们的一个参数,以及所有其他变量和作用域链。
var Foo = function (arg) {
    this.arg = arg;

    function bar () {
        console.log(this);
        console.log(this.arg);
    }

    this.bar = bar.bind(this);
};

var foo = new Foo();
module.execute('action', foo.bar);