10

假设我们在 HTML 文件中有以下代码:

<script id='tag-1'>
  function foo(){
    alert("this is foo-1");
  }
</script>

<script id='tag-2'>
  function foo(){
    alert("this is foo-2");
  }
</script>

<script id='tag-3'>
  function foo(){
    alert("this is foo-3");
  }
</script>

foo是否可以从带有 id 的脚本标签调用函数tag-2?我只是想知道是否有任何跨浏览器解决方案?多谢你们。


好的,我们有两个非常相关的建议——一个我标记为接受的答案,另一个是这篇文章下方的评论——@dfsq 提出的一个。谢谢大家!!!

4

6 回答 6

6

不,不诉诸eval().

当浏览器评估每个脚本块时,该函数的先前版本将被覆盖。

可以访问每个标签的文本上下文<script>,但前提是它是内联的。访问<script src="...">标签的来源需要 AJAX。

于 2013-05-31T12:34:18.463 回答
3

是的,这是完全可能的,但您应该使用 text/javascript 以外的类型。

<script id='tag-1' type="myScriptHolder">
  function foo(){
    alert("this is foo-1");
  }
</script>

<script id='tag-2' type="myScriptHolder">
  function foo(){
    alert("this is foo-2");
  }
</script>

<script id='tag-3' type="myScriptHolder">
  function foo(){
    alert("this is foo-3");
  }
</script>

<script>
$.globalEval($('#tag-1').text();
</script>
于 2013-05-31T13:10:53.673 回答
2

不,这是不可能的。同一窗口中的所有 Javascript 代码共享相同的命名空间,因此您在示例中所做的只是覆盖foo,这意味着最终您只有“foo-3”。

每个 iframe 都有自己的命名空间,但将 iframe 用于这样的事情是没有意义的。

如果这些函数仅由其相应的脚本需要,那么您可以将每个脚本包装在一个自执行函数中,例如

(function() {
  function foo(){
    alert("this is foo-1");
  }
})();

这意味着foo将无法从该脚本外部访问,这显然可能对您有用,也可能不适合您,具体取决于使用该函数的位置。

唯一的其他选择是为函数创建自己的命名空间,例如:

var namespace1 = {};
namespace1.foo = function foo() {...}
于 2013-05-31T12:38:48.140 回答
0

Javascript没有函数重载。具有相同名称(变量或函数)的每个下一个声明只需使用提供的新值重新声明它。因此,在您的情况下,来自 tag-3 的函数将始终被执行。

您想要的可能解决方案是
1. 为每个函数提供不同的名称。

2. 如果您希望根据提供的参数以不同方式调用函数。您可以检查函数内部的隐式参数对象并根据它进行必要的操作。

第二种解决方案的简单示例如下。

function foo(bar){
    if(typeof bar==="number"){
         //Do number specific stuff here
    } else if(typeof bar==="string"){
        //Do string specific stuff here
    } else {
    }
}
于 2013-05-31T12:37:53.413 回答
0

您可以实现一种相当常见的 javascript 命名空间技术。这将创建一个可用的新 javascript 对象,您可以通过调用 CodeGuru.File1.Foo(); 来引用它。

var CodeGuru = CodeGuru || {};  
var CodeGuru.File1 = CodeGuru.File1 || {};
(function(CodeGuru) {
    CodeGuru.File1.Foo = function() {
        //insert code
    }
 })(CodeGuru);
于 2013-05-31T13:06:26.070 回答
0

像这样的东西怎么样:

if (typeof (GenLib) == "undefined") GenLib = {};

    GenLib.Tag1 = {};
    GenLib.Tag2 = {};
    GenLib.Tag3= {};

    GenLib.Tag1.Foo = function () {
        alert("this is foo-1");
    };

    GenLib.Tag2.Foo = function () {
        alert("this is foo-2");
    };

    GenLib.Tag3.Foo = function () {
        alert("this is foo-3");
    };

    var theOneYouWantNow = GenLib.Tag2; // Or Tag1 or Tag3, use if/switch/whatever here.

    theOneYouWantNow.Foo();
于 2013-05-31T14:57:05.893 回答