我对这个简单代码中 this 的情况感到困惑:
function foo() {
alert(this.a );
}
function doFoo(fn) {
a = "local";
fn();
}
var a = "global";
doFoo( foo );
根据我所学到的,deFoo是调用foo的上下文对象,因此警报的消息应该是" local"。这是有效的,除非我在doFoo中声明 a :
function doFoo(fn) {
var a = "local";
fn();
}
现在警报消息是" global"。谁可以给我解释一下这个?我是Javascript的新手。
答案 0 :(得分:1)
很少有事情需要考虑:
value
这取决于function
的调用方式!function
下调用global-context
,则this
引用window
(在浏览器中)variable
定义var
,则它是全局变量。在您的示例中,函数a
内的doFoo
引用window.a
local
,在调用函数时会被覆盖。
function foo() {
alert(this.a);
}
function doFoo(fn) {
console.log(window.a);
a = "local"; //window.a is set to "local"
fn();
}
var a = "global"; //window.a is "global"
doFoo(foo);
//Few logs to make it clear
console.log(window.doFoo);
console.log(window.a);
答案 1 :(得分:0)
Javascript有lexical scope,因此在您的示例field Record1Field0 Record1Field1 Record1Field2
dataTime
2000-01-01 3 7 2
2000-01-01 3 8 4
2000-01-02 8 7 9
2000-01-02 2 6 3
2000-01-03 4 1 9
2000-01-03 1 2 2
2000-01-04 8 9 8
2000-01-04 5 9 4
中始终引用this
的全局版本,该版本会在第一个代码段中被覆盖。
由于a
在该范围内定义了一个新变量,因此您不会修改全局变量,因此会在第二个代码段中打印var
。
答案 2 :(得分:0)
首先<configuration>
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property>
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
<property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>s8:8025</value> </property>
<property> <name>yarn.resourcemanager.scheduler.address</name> <value>s8:8030</value> </property>
<property> <name>yarn.resourcemanager.address</name> <value>s8:8032</value> </property>
<property> <name>yarn.log.server.url</name> <value>http://s8:19888/jobhistory/logs/</value> </property>
<!-- job history -->
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property>
<property> <name>yarn.nodemanager.log.retain-seconds</name> <value>900000</value> </property>
<property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/app-logs</value> </property>
<!-- proxy -->
<property><name>yarn.web-proxy.address</name><value>s8:9046</value></property>
<!-- to check the classpath in yarn, do yarn classpath -->
<!-- compress output data -->
<property><name>mapreduce.output.fileoutputformat.compress</name><value>false</value></property>
<property><name>mapred.output.fileoutputformat.compress.codec</name><value>org.apache.hadoop.io.compress.BZip2Codec</value></property>
<!-- Node configuration -->
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>33554432</value> </property>
</configuration>
为a
,然后我们致电global
,doFoo
global
设为a
。
我们现在调用调用local
的{{1}},此处fn()
指的是当前执行上下文。此处foo()
指的是this
范围。
警告this
为您提供额外的功课:遵循类似的逻辑,为什么以下警告global
?
local
范围上的示例
1
global
2
var a = "global"
function thisA()
{
var a = "local";
fn();
}
function fn()
{
alert(this.a);
}
thisA();
3
var a = 3;
function myA()
{
a = 2;
}
myA();
console.log(a); // 2
4
var a = 3;
function myA()
{
var a = 2;
}
myA();
console.log(a); // 3