在另一个作用域中声明变量

Declare variable in another scope

本文关键字:声明 变量 作用域 另一个      更新时间:2023-09-26

看看这个剪切的代码:

main = function() {
  alert('This is ' + T);
}
caller = function() {
  var T = 'me';
  main();
}
caller();

正如你所看到的,我想用函数main来识别变量T的值,但浏览器出现了这个错误:T是未定义的。

我可以通过将变量T的作用域更改为全局作用域,甚至将T变量传递给函数main来处理这个错误,但由于某种原因,我不想使用这些变量,我想在函数main的作用域中声明变量T。这可能吗?我该如何处理这种情况?

谢谢。

您有3个选项:

  • 在两者之外声明T
  • 将T作为参数传递给main(T)
  • 在调用者内部写入main

Tcaller的局部变量,因此它在main内部不可见,一个简单的解决方案是将T作为参数从main 传递到caller

您需要将T作为参数传递

main = function(T) {
  alert('This is ' + T);
}
caller = function() {
  var T = 'me';
  main(T);
}
caller();

另一种解决方案是在共享作用域中声明T,在本例中为全局作用域,或者在main 内声明main为闭包函数

在我看来,除了已经说明的显而易见的选项之外,还有一些选项。

一种方法是在调用者中声明main:

caller = function() {
  var T = 'me',
      main = function() {
        alert('This is ' + T);
      };
  main();
}
caller();

另一种情况是将调用者和main都封装到一个对象中,但这可能有些过头了。还有另一种方式可以是使用Function.prototype.callFunction.prototype.bind:设置this变量

main = function() {
  alert('This is ' + this);
}
caller = function() {
  var T = 'me';
  main.call(T);
}
caller();

main = function() {
  alert('This is ' + this);
}
caller = function() {
  var T = 'me',
      newMain = main.bind(T);
      newMain();
}
caller();
执行此操作的最佳方法是定义一个新函数,声明Tmaincaller。这样,两个函数都可以访问值,但它不是全局
var pair = (function() { 
  var T;
  var main = function() { 
    alert('This is ' + T);
  };
  var caller = function() { 
    T = 'me';
    main();
  };
  return { 'main': main, 'caller': caller}
})();
pair.main(); // Call main
pair.caller(); // Call caller

尝试将变量T的对象传递给函数main,并通过this 访问它

main = function() {
   alert('This is ' + this);
}
caller = function() {
   var T = 'me';
   main.call(T);
}
caller();

我可以回忆三个选项:

  • 使T全球化
  • 在调用者对象中生成getter并使用它来获取值
  • 将T作为参数传递

试试这个

var T = '';
main = function() {
  alert('This is ' + T);
}
caller = function() {
  T = 'me';
  main();
}
caller();

我认为这样的东西可以处理它。

main = function() {
  alert('This is ' + T);
}
caller = function() {
  var T = 'me';
  eval('var func = ' + main);
  func();
}
caller();