里面的`this`函数与函数无关?

时间:2013-12-02 04:34:14

标签: javascript

var f2 = undefined
var f1 = function () {
    f2 = this
    console.log('here')
}
f1()
f2()

输出

f2()
^
TypeError: undefined is not a function

如何从f1()的内部设置f2到f1?

2 个答案:

答案 0 :(得分:2)

这实际上并不是设置它的正确方法,但即使是这样,您也从未调用f1,因此f2的值永远不会改变。你需要这个:

var f2 = undefined;
var f1 = function () {
    f2 = this;
    console.log('here');
}
f1();
f2();

也就是说,上面的代码仍然不起作用,因为独立函数内的this不是函数。在浏览器中,它将是window对象,您将获得类似TypeError: object is not a function的内容。在其他上下文中(例如,node.js),它将取决于它们如何实现顶级对象(如果有的话)。

great question解释函数如何与this关键字一起使用。在这种情况下,如果不按名称引用外部函数或更改调用f1的方式,您将无法执行此操作:

// Referring to f1 by name..
var f2 = undefined;
var f1 = function () {
    f2 = f1;
    console.log('here');
}
f1();
f2();

// .. or using the apply method to change the value of "this", though still
// referring to f1 by name in some sense (at the call site)
var f2 = undefined;
var f1 = function () {
    f2 = this;
    console.log('here');
}
f1.apply(f1);
f2();

旁注,分号省略是粗略的。

答案 1 :(得分:1)

如果没有包装,我不确定是否有任何办法。

var wrapper = {}

wrapper.f1 = function () {
    wrapper.f2 = wrapper.f1
    console.log('invoked', this)
}

wrapper.f1()
wrapper.f2()

我不确定这是否适用于您的实际使用案例。

var whatIsThis = function() {
    console.log('invoked', this)
}

whatIsThis()

在相关说明中,第二个示例显示了浏览器中的窗口对象。我不知道它会在节点中显示什么。