在另一个范围内声明变量

时间:2013-08-14 06:40:25

标签: javascript

看看这段剪辑代码:

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

caller = function() {
  var T = 'me';
  main();
}

caller();

如你所见,我想函数main识别变量T的值,但浏览器出现此错误:T未定义。

我可以通过将变量T的范围更改为全局范围来处理此错误,甚至将T变量传递给函数main,但由于某种原因我不想使用那些并且我想在范围内声明变量T功能主要。有可能吗?我该如何处理这种情况?

感谢。

8 个答案:

答案 0 :(得分:6)

您有3个选项:

  • 在两者之外宣布T
  • 将T传递给main(T)作为参数
  • 写主要内部来电者

答案 1 :(得分:3)

Tcaller的局部变量,因此在main内不可见,一个简单的解决方案是将T作为参数传递给{{1}来自caller

您需要将main作为参数传递

T

另一种解决方案是在共享范围内声明main = function(T) { alert('This is ' + T); } caller = function() { var T = 'me'; main(T); } caller(); ,这种情况下是全局范围或将T声明为main内的闭包函数

答案 2 :(得分:2)

我看到它的方式,除了你已经说过的明显选择之外,你还有一些选择。

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

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

caller();

另一种情况是将调用者和主要包装成一个对象,但这可能是矫枉过正的。另一种方法是使用thisFunction.prototype.call设置Function.prototype.bind变量:

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();

答案 3 :(得分:1)

执行此操作的最佳方法是定义一个声明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

答案 4 :(得分:1)

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

访问它
main = function() {
   alert('This is ' + this);
}

caller = function() {
   var T = 'me';
   main.call(T);
}

caller();

答案 5 :(得分:0)

我记得三个选项:

  • make T global;
  • 在调用者对象中创建一个getter并使用它来获取值
  • 将T作为参数传递

答案 6 :(得分:0)

试试这个

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

caller = function() {
  T = 'me';
  main();
}

caller();

答案 7 :(得分:0)

我认为这样的事情可以解决它。

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

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

caller();