根据我的理解,直到一个对象调用一个函数,这个实际上被分配了一个值。它所分配的值完全基于调用函数的对象。
此外,JS中的范围链规则是LEG。
所以,在(严格模式):
function one () {
var a = 2;
function two () {
console.log(a)};
two()
}
one() // output 2
可是:
function one () {
var a = 2;
function two () {
console.log(this.a)};
two()
}
one() //output undefined
我的理解函数是对象,在上一次调用中,函数对象一个将调用两个,这将转换这个。 a 进入 one.a 。显然事实并非如此。
此外:
function one () {
var a = 2}
console.log(one.a) //outputs undefined
非常感谢任何有关正在发生的事情的澄清。
由于
答案 0 :(得分:1)
function one () {
var a = 2;
function two () {
console.log(this.a)};
two()
}
one() //output undefined
您在此处同时将one
和two
称为函数,而不是某些对象的属性(例如someObject.one()
)。这意味着this
将引用全局范围(如果代码处于严格模式,则引用undefined
)。全局范围的a
属性为undefined
,因此您就会看到undefined
。在two()
内拨打one()
并不会使this
引用one
。
function one () {
var a = 2}
console.log(one.a) //outputs undefined
a
不是one
的属性。它内部是一个变量 。 one
的属性看起来像这样。
function one() {
}
one.a = 7;
console.log(one.a);
答案 1 :(得分:0)
我认为您将常规函数视为类对象。你只调用一个()但实际上并没有实例化一个新的One()对象。
答案 2 :(得分:0)
范围 和 上下文 是不同的概念。在JS函数范围内,只要此函数本身是外部范围的成员,就可以解决在函数内部分配的任何值或在此类函数外部分配的任何值。此外,只要函数不创建闭包,就会在函数的调用时创建 范围 。 上下文也是可寻址的。但与范围不同, 上下文在函数调用时被评估。因此,this
只是上下文的占位符,可以在一次调用函数时发生变化。
function contextAwareMethod(injectedValue) {
"use strict";
var
context = this, // dynamically evaluated.
innerScopeValue = "created at a functions call time";
console.log('dynamically evaluated context : ', context);
console.log('this.contextValue : ', (context && context.value));
console.log('innerScopeValue : ', innerScopeValue);
console.log('injectedValue : ', injectedValue);
}
console.log('"case A"');
contextAwareMethod('argument A');
console.log('\n');
console.log('"case B"');
contextAwareMethod.call({ value: "conext B"});
console.log('\n');
console.log('"case C"');
contextAwareMethod.call({ value: "conext C"}, 'argument C');
console.log('\n');
.as-console-wrapper { max-height: 100%!important; top: 0; }