在特定情况下由Javascript混淆了这种行为

时间:2016-08-30 17:21:31

标签: javascript this

我对这个简单代码中 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的新手。

3 个答案:

答案 0 :(得分:1)

很少有事情需要考虑:

  1. value这取决于function的调用方式!
  2. 如果在function下调用global-context,则this引用window(在浏览器中)
  3. 如果未使用关键字variable定义var,则它是全局变量。
  4. 在您的示例中,函数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,然后我们致电globaldoFoo 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