javascript - 在 Chrome 开发工具中使用词法作用域(闭包)调试 angularjs 指令时出现奇怪的行为

标签 javascript angularjs google-chrome-devtools lexical-scope

这是我的代码,其中包含一个名为 test 的简单指令:

var app =  angular.module("app",[]);

app.directive('test',function(){
   return {
      link(scope,el,attrs){
        var outerVar = 'im in the outer scope';

        var myFunc = function(){
           var someText = 'just to be able to put a breakpoint here';
        }

        myFunc();

      }
   }
});

我在 var someText 处添加了断点。然后,我尝试通过输入outerVar从开发工具控制台获取值,但出现“ReferenceError:outerVar未定义”。

但是当我将 myFunc 修改为

var myfuction(){
 console.log(outerVar);
};

我正在获取值,甚至可以在开发工具控制台上输出 outVar 的值,但只能输出 outVar 而不是范围、el 和 attrs 等外部变量...如果我执行 a对于其他变量,我得到了相同的结果——它有效,但在开发工具控制台中无效。

最佳答案

当 Chrome 开发者工具遇到您设置的断点时,它会在“源”和“控制台”选项卡中显示并提供对本地全局变量的访问。当在您设置断点的函数范围内使用“闭包”变量时,它还将提供对“闭包”变量的 View 和访问。这就是为什么您在调用 console.log() 内部时看到外部变量的原因你的函数。

开发人员工具不提供对外部作用域中任何变量的访问权限,这些变量未在设置断点的本地作用域中使用。为了在“控制台”中访问此类变量并在“源”中查看,您可以在“源”的“调用堆栈”部分中选择断点上方的范围。

下面是一个带注释的示例,讨论变量在函数内部断点处可见的位置。它不包含任何 AngularJS 代码,因为您描述的问题根本不是 Angular 特有的。

// seen as "Global" from breakpoint inside of myFunc or anywhere else
var global = "global"; 

(function() {
  // seen as "Closure" from breakpoint inside of myFunc only if used there 
  var outer = "outer"; 

  function myFunc() {
    // seen as "Local" from breakpoint inside of myFunc
    var inner = 'inner'; 

    // uncomment to see "outer" in Dev Tools
    //outer;

    debugger;
  }      
  myFunc(); 
})( );

Plunkr

关于javascript - 在 Chrome 开发工具中使用词法作用域(闭包)调试 angularjs 指令时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462010/

相关文章:

javascript - 如何弄清楚网站中的请求是如何发起的?

javascript - 如何通过单击按钮更改 Google map 中心

javascript - Highcharts 热图 Legend Max

javascript - 构建 Meteor 应用程序返回错误 : EPERM, 符号链接(symbolic link)

javascript - AngularJS 中 input[date] 和 Moment.js 的绑定(bind)

Android 将 html 数据加载到 chrome 自定义选项卡中

google-chrome - 用于指示/显示 CA 根证书的 Chrome 扩展?

javascript - Closest 不适用于动态添加的内容

javascript - $http 计时问题,AngularJS

angularjs - 使用 Ionic 框架将事件添加到设备日历