javascript - JS引擎如何操作未声明的变量?

标签 javascript variables

<!DOCTYPE html>
<html>
  <head>
    <meta lan="en-us" charset="UTF-8">
  </head>
  <body>

    <p>Counting with a local variable.</p>

    <p id="demo"></p>
    <button type="button" onclick="myFunction('+')">Count +</button>
    <button type="button" onclick="myFunction('-')">Count -</button>

    <script>
      document.getElementById("demo").innerHTML = 0;
      function add(number){
        var counter = 0;
        return function() {return counter += number;} 
      }
      function sub(number){
        var counter = 0;
        return function() {return counter -= number;} 
      }

      var counterIncr = add(1);
      var counterDicr = sub(1);

      function myFunction(s){
        if( s == "+"){
          /*this.*/counter1 = counterIncr();
        }
        else if (s == "-"){
          /*this.*/counter2 = counterDicr();
        }

        if(!counter2 && counter1){
          document.getElementById("demo").innerHTML = counter1;
        }
        else if(!counter1 && counter2){
          document.getElementById("demo").innerHTML = counter2;
        }
        else if(counter1 && counter2){
          document.getElementById("demo").innerHTML = (counter1 + counter2);
        }
      }
    </script>

  </body>
</html>

在研究 JS 闭包期间,我扩展了一个 W3C 示例,实现了一个带有两个按钮的 HTML 页面。该示例只有一个按钮。第一个按钮增加点击计数器,第二个按钮减少该计数器。定义了一个函数“myFunction”,它使用两个变量“counter1”和 counter2”来完成这项工作。这些变量被声明为 this.counter1 和 this.counter2,并且此页面的实现按预期工作。 我的问题: 当我从 counter1 和 counter2 声明中省略“this”时(...只是为了好玩),我的页面仍然有效(肯定不是在严格模式下),但仅当两个按钮都被单击一次时。如何解释这种行为,或者 JS 引擎如何在幕后操作(处理)未声明的变量?

最佳答案

未显式声明的变量将始终自动成为全局变量:

function myFunction() {
  // explicitly declared variable (local)
  var explitic = "foo";
  
  // implicitly declared variable (global)
  implicit = "bar";
}
    
myFunction(); // call function

console.log(typeof explicit); // prints "undefined" since local
console.log(typeof implicit); // prints "string" since global

更多示例 here .

另一方面,严格模式根本不接受隐式声明的变量:

"use strict";

var explicitGlobal = "foo";

function myFunction() {
  // works because explicitGlobal is already defined
  explicitGlobal = "foo2";

  // Uncaught ReferenceError: implicit is not defined
  implicit = "bar";
}
        
myFunction();

关于javascript - JS引擎如何操作未声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081420/

相关文章:

javascript - 检查提到的个人资料是否是机器人

javascript - 如何正确增加好恶

java - 分配非静态变量的静态方法

javascript - 如何将javascript变量传递为json格式

javascript - AngularJS 禁用键的方法

javascript - 使用 ReactCSSTransitionGroup 在 React 中进行变量转换

javascript - 将值写入 div 时出现 insideHTML 问题

java - 将带有自定义参数的 Java 构造函数转换为 Objective-C 代码

Java 字符变量

c# - 检测变量变化c#