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分真么就这么难呢!
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已经超出了作用域了。

a1 = function(v){
alert("a1" + v);
}
这句相当于定一个变量,其值是一个函数。由于a1未定义【注:未使用var先定义】
就直接给其赋值,所以a1作用域是全局的。
而functin a1这种形式,作用域是当前函数快。
楼主可以试下将
var a1 = function(v){
alert("a1" + v);
}
放在ready的function里边看看效果 :D

有几个错别字,重新整理了下:
a1 = function(v){
alert("a1" + v);
}
这句相当于直接给a1赋值,其值是一个函数。由于a1未定义【注:未使用var先定义】
就直接给其赋值,所以a1作用域是全局的。
而functin a1这种形式,作用域是当前函数块。
楼主可以试下将
var a1 = function(v){
alert("a1" + v);
}
放在ready的function里边看看效果 :D

第一种和第三种写法会使得a1这个函数做为window的属性,此时该函数处于全局作用域,第二种方式所定义的a1只会做为回调函数激活对象的属性,它只存在与该函数的作用域,你可以这么写:
[code="js"]
$(document).ready(function(){
$("input").blur(function(){
var functionName = $(this).attr("class");
a1(1);
});

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

[/code]

你的问题:
我想知道这是为什么?a1 = function().....这种形式的作用域比 function a1.......这种形式作用域大吗?

我的解释,a1全局作用域,function a1为当前函数块的作用域,具体的解释就是我之前回复的内容。 :)