如何从函数外部获取函数的this
值,而不必调用它?例如,以下内容不起作用,但说明了这个想法:
// window is this, currently
function foo() {}
console.log(foo.this) // would log the window object.
Function.bind()的MDN文档报告bind()
"创建了一个新功能,在调用时,将其关键字设置为提供的值"。这意味着每个函数都有一个"这个"从ery开始就与之相关联。
问题在于是否"这个"可以从函数调用之外访问,因为可能是它"这个"已经存在基于MDN文档的引用。
在您的控制台中尝试此操作:
var foo = function() {}
var bar = foo.bind(this)
console.log(foo === bar)
结果为false
,这意味着您现在有两个功能,而不是一个,每个功能都拥有this
。
有些人提到了#34; callsite"确定函数的this
,它似乎不是真的。如果你运行
var obj = {}
function foo() {
console.log(this)
}
function Obj(func) {
console.log(this)
func()
}
new Obj(foo)
然后foo的callsite位于new Obj
内,但它仍然记录Window
对象。
如果你跑
var obj = {}
function foo() {
console.log(this)
}
foo()
foo.call(obj)
foo.bind(obj)
foo()
然后你会注意到原始foo函数的this
没有改变。基于这一事实以及bind
,call
和apply
的MDN文档,我们可以自信地假设函数的this
永远不会被更改。
答案 0 :(得分:3)
这个可以根据您调用函数的方式进行更改,因此,没有真正的方法可以将其置于函数之外。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
答案 1 :(得分:2)
没有办法获得this
的值,因为this
实际上并不与函数对象相关,而是与执行上下文相关联函数被调用。
execution context具有以下属性:
<强> LexicalEnvironment 强>
标识用于解析此执行上下文中的代码所做的标识符引用的词法环境。<强> VariableEnvironment 强>
标识词法环境,其环境记录包含由此执行上下文中的VariableStatements和FunctionDeclarations创建的绑定。<强> ThisBinding 强>
与此执行上下文关联的ECMAScript代码中与this
关键字关联的值。
现在,当一个函数被称为时,the following steps take place:
10.4.3 Entering Function Code
当控件进入函数对象 F 中包含的函数代码的执行上下文,调用者提供的 thisArg 和调用者提供的 argumentsList :
- 如果function code为strict code,请将ThisBinding设置为 thisArg 。
- 如果 thisArg null 或 undefined ,请将ThisBinding设置为global object。
- 否则如果Type( thisArg )不是Object,则将ThisBinding设置为ToObject( thisArg )。
- 否则将ThisBinding设置为 thisArg 。
- 让 localEnv 成为调用NewDeclarativeEnvironment传递 F 的[[Scope]]内部属性值作为参数的结果。
- 将LexicalEnvironment设置为 localEnv 。
- 将VariableEnvironment设置为 localEnv 。
- 让代码为 F 的[[代码]]内部属性的值。
- 使用function code 代码和 argumentList 执行声明绑定实例化,如10.5中所述。
醇>
特别注意
[...]来电者提供 thisArg [...]
这应该明确this
的值由函数的调用者提供。
示例:
当一个函数被调用为foo()
时,则没有thisArg
,因此它是undefined
。在这种情况下,执行步骤2并将this
绑定到全局对象。
但是,如果某个函数被称为foo.call(bar)
,则thisArg
为bar
,并且会发生第3步或第4步,具体取决于bar
是对象还是不
我希望这可以解释为什么无法获得函数的this
值。
答案 2 :(得分:-1)
你需要一些功能帮助。
function foo(){
return this;
};
console.log(foo());