xichao007521 2010-06-12 13:21
浏览 512
已采纳

js 中的 new Function 作用范围

请看这一段代码:
[code="js"]
$(document).ready(function(){
$("input").blur(function(){
var functionName = $(this).attr("class");
new Function(functionName+"(1)")();
});
});
function a1(v){
alert("a1" + v);
}
[/code]
页面上的一个input框,鼠标移开时弹出提示框,这里用的是new Function动态调用函数,这个代码正常运行,
当我把a1放入ready里面时,如下代码:
[code="js"]
$(document).ready(function(){
$("input").blur(function(){
var functionName = $(this).attr("class");
new Function(functionName+"(1)")();
});

            function a1(v){
                alert("a1" + v);
            }
        });

[/code]
这时代码无效,提示找不到a1这个函数。
但是把函数写成
[code="js"]
a1 = function(v){
alert("a1" + v);
}
[/code]
放在那里都可以用,我想知道这是为什么?a1 = function().....这种形式的作用域比 function a1.......这种形式作用域大吗?

  • 写回答

5条回答 默认 最新

  • iteye_20833 2010-06-13 14:07
    关注

    拿个5分真么就这么难呢!
    1 函数定义的三种方式function funcitonname(){} var functionnam(){} new Function()
    其中,前两种定义完全等价。函数的作用域基于此法作用域,静态编译。
    2 Function()构造函数是在每次被调用的时候,动态的创建一个新的函数对象(动态变异)。也就是说你焦点离开input的时候,才会创建al1这个函数对象。并且这个函数是不使用词法作用域的,也就是说,它总是作为一个顶层函数来编译的。其作用域是全局。比如你的代码中当你离开input焦点的时候,在内存中编译完的代码应该是这样:
    实际代码(焦点离开input时,你的functionName为a是吧?):
    [code="java"]$(document).ready(function(){
    $("input").blur(function(){
    var functionName = $(this).attr("class");
    new Function(functionName+"(1)")();
    });

                function a1(v){
                    alert("a1" + v);
                }
            });[/code]
    

    动态编译后的代码:
    [code="java"]
    $(document).ready(function(){
    $("input").blur(function(){
    var functionName = $(this).attr("class");
    new Function(functionName+"(1)")();
    });

                function a1(v){
                    alert("a1" + v);
                }
            });
    

    new Function(a1);
    [/code]
    其中[code="java"]function a1(v){
    alert("a1" + v);
    }[/code]
    new Function(a1)调用的时候函数a1已经超出了作用域了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求