1

看看这个截断的代码:

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

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

caller();

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

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

谢谢。

4

8 回答 8

6

您有 3 个选项:

  • 在两者之外声明 T
  • 将 T 作为参数传递给 main(T)
  • 在调用者内部编写 main
于 2013-08-14T06:42:26.840 回答
3

T是一个局部变量,caller所以它在内部不可见main,一个简单的解决方案是T作为参数传递给callerfrommain

你需要T作为参数传递

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

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

caller();

另一种解决方案是T在共享作用域中声明,这种情况下是全局作用域或者声明main为闭包函数里面main

于 2013-08-14T06:41:50.753 回答
2

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

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

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

caller();

另一种情况是将调用者和 main 都包装到一个对象中,但这可能是矫枉过正。还有另一种方法是使用or设置this变量:Function.prototype.callFunction.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();
于 2013-08-14T06:46:47.903 回答
1

最好的方法是定义一个新函数来声明T,maincaller. 这样,两个函数都可以访问该值,但它不是全局的

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
于 2013-08-14T06:43:19.930 回答
1

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

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

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

caller();
于 2013-08-14T06:43:40.713 回答
0

我可以回忆三个选项:

  • 使 T 全局化;
  • 在调用者对象中创建一个 getter 并使用它来获取值
  • 将 T 作为参数传递
于 2013-08-14T06:45:57.440 回答
0

尝试这个

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

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

caller();
于 2013-08-14T06:46:54.020 回答
0

我认为这样的事情可以处理它。

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

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

caller();
于 2013-10-12T11:27:59.863 回答