是否可以从HTML文件中的特定脚本标签引用函数或对象?

Is it possible to refer to function or object from particular script tag in HTML file

本文关键字:引用 标签 脚本 函数 对象 HTML 文件 是否      更新时间:2023-09-26

假设我们在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>

是否可以从id为tag-2的脚本标签调用功能foo ?我只是想知道是否有任何跨浏览器的解决方案?谢谢的家伙。


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

不可能,没有eval()是不可能的。

由于每个脚本块都由浏览器计算,因此该函数的先前版本将被覆盖。

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

是的,这是完全可能的,但你应该使用文本/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>

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

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

如果函数只有对应的脚本才需要,那么你可以将每个脚本包装在一个自执行的函数中,例如

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

这将意味着foo将无法从脚本外部访问,这显然可能会或可能不会为您工作,这取决于在哪里使用函数。

唯一的替代方法是为函数创建自己的命名空间,例如:

var namespace1 = {};
namespace1.foo = function foo() {...}

Javascript没有函数重载。每个具有相同名称(变量或函数)的下一个声明只是重新声明它并提供新的值。所以在这种情况下,标签-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 {
    }
}

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

来引用它。
var CodeGuru = CodeGuru || {};  
var CodeGuru.File1 = CodeGuru.File1 || {};
(function(CodeGuru) {
    CodeGuru.File1.Foo = function() {
        //insert code
    }
 })(CodeGuru);

这样如何:

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