JavaScript - 为什么此代码记录 'undefined' 但显示在 Chrome 控制台中? (关闭)

标签 javascript closures

我做了这个例子:

(function(_stack_){
  var stack = {
    over: 'flow',
    run: function(){
      console.log(this);
    }
  };
  _stack_.app = stack;
  stack.run();
})(this);

app.foo = 'bar';

Chrome 控制台中的输出:

enter image description here

但是这个输出是怎么来的:

(function(_stack_){
  var stack = {
    over: 'flow',
    run: function(){
      console.log(this.foo); // undefined
    }
  };
  _stack_.app = stack;
  stack.run();
})(this);

app.foo = 'bar';

当它显示在 Chrome 控制台中时等于 undefined

查看 JS Bin

编辑: 我知道它变得未定义,因为在分配 app.foo 之前调用了 stack.run() 。问题是它怎么会出现在控制台中?

最佳答案

this.foo 在你运行时不可用

这是糟糕的设计,当像这样使用 javascript 时,您可能更多地使用自定义构造函数和事件处理。您的代码和问题表明 run 方法应该在您更新动态创建的变量 app 时执行。除非您为此实现一些事件处理,否则这永远不会发生。

但是,如果您在设置 app.foo 变量后调用 app.run();,您的代码仍然有效。

// Antipattern ahead!
(function(_stack_){
  var stack = {
    over: 'flow',
    run: function(){
      // Prevent error messages
      if(typeof this.foo === 'undefined') {
          return;
      }
      console.log("log: " + this.foo); // undefined
    }
  };
  _stack_.app = stack;
})(this);

app.foo = 'bar';
app.run(); // log: bar

关于JavaScript - 为什么此代码记录 'undefined' 但显示在 Chrome 控制台中? (关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949263/

相关文章:

javascript - 我网站上这个神秘的左边距是怎么回事?为什么它不与我的浏览器的左边缘齐平?

javascript - 在带有 Javascript 闭包的回调函数中,如何访问全局变量

html5/JS 中的 java 桌面应用程序 gui

javascript - 自调用匿名函数解析问题

javascript - 如何向 WebGL 着色器绘制的圆形/椭圆形添加统一宽度的轮廓(使用边缘/距离抗锯齿绘制)

javascript - 在 Perl 中支持 JavaScript 的网络爬虫?

javascript - 如何在 Clojure 中编写一个保持状态的闭包?

javascript - jQuery.ajax() 中的范围问题

swift - 为什么添加闭包捕获列表会阻止我的实例被释放?

c# - 这是 C# 中的闭包示例吗?