JS:将作用域作为参数传递,将其绑定到将返回的函数

JS: Passing a scope as argument, binding it to a function that will be returned

本文关键字:绑定 返回 函数 参数传递 作用域 JS      更新时间:2023-09-26

是否可以在父函数的作用域中定义一个函数,并在返回之前将通过父函数传递的参数绑定为其作用域?

下面是一个示例:

var myObject = {
    foo: "bar"
};
var myFunction = (function() {
    return function() {
        return this.foo;
    };
}).call(myObject);
myFunction.call(myObject); // I'd like to bind myObject as this does ...
myFunction(); // ... but I'd like to do it before invoking it, without .call() or .apply()

或者另一个复杂的例子,描述了我正在尝试做的事情:

var createMyCopy = function(original, self) {
    var copy;
    eval("copy=" + original.toString());
    console.log(copy()); // returns undefined
};
(function() {
    var self = "Hello world",
        myFunction = function() {
            return self;
        };
    console.log(myFunction()); // returns "Hello world"
    createMyCopy(myFunction);
})();

我正在尝试创建一个函数的副本,以便我可以在不更改原始函数的情况下对其进行更改,但我希望在副本中也包含原始函数中定义的变量......

你的意思是这样吗?

var myObject = {
    foo: "bar"
};
var myFunction = (function() {
    var self = this;
    return function() {
        return self.foo;
    };
}).call(myObject);

我认为你的问题混淆了范围和上下文。

我想你的意思是:

var myFunction = (function(obj) {
    return function() {
        return obj.foo;
    };
})(myObject);

立即调用的函数表达式myObject传递并返回一个新函数,其中该参数绑定为变量 obj

我不确定你的意思,但你可以这样做:

var myObject = {
    foo: "bar"
};
function myFunction() {
    return this.foo;
}
console.log(myFunction.apply(myObject)); // bar

apply的第一个参数是context(即this所指的)。apply的第二个参数是参数数组(但我在这里省略了它,因为没有参数)。