0 0

js 中的 new Function 作用范围5

请看这一段代码:
			$(document).ready(function(){
				$("input").blur(function(){
					var functionName = $(this).attr("class");
					new Function(functionName+"(1)")();
				});
			});
			function a1(v){
					alert("a1" + v);
			}
		

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

这时代码无效,提示找不到a1这个函数。
但是把函数写成
a1 = function(v){
        alert("a1" + v);
}

放在那里都可以用,我想知道这是为什么?a1 = function().....这种形式的作用域比 function a1.......这种形式作用域大吗?

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

写成a1 = function....这种形式是好用的,我说的是另一种形式不好用

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



这样是可以的,但是我想通过functionName调用下边的方法a1,就出现我前面提到的问题了
2010年6月12日 13:21

5个答案 按时间排序 按投票排序

0 0

采纳的答案

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

$(document).ready(function(){
				$("input").blur(function(){
					var functionName = $(this).attr("class");
					new Function(functionName+"(1)")();
				});
				
				function a1(v){
					alert("a1" + v);
				}
			});

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

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

new Function(a1)调用的时候函数a1已经超出了作用域了。

2010年6月13日 14:07
0 0

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

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

2010年6月13日 08:34
0 0

第一种和第三种写法会使得a1这个函数做为window的属性,此时该函数处于全局作用域,第二种方式所定义的a1只会做为回调函数激活对象的属性,它只存在与该函数的作用域,你可以这么写:

 
$(document).ready(function(){
				$("input").blur(function(){
					var functionName = $(this).attr("class");
					a1(1);
				});
				
				function a1(v){
					alert("a1" + v);
				}
			});


2010年6月12日 21:10
0 0

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

2010年6月12日 14:50
0 0

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

2010年6月12日 14:48

相关推荐

    你可能不知道的JavaScript的new Function()方法

    `new Function()` 是JavaScript中的一个不太常见的构造函数,它允许我们动态地创建函数。这个方法在某些特定场景下非常有用,尽管在日常编程中不常用,因为它与传统的函数声明和匿名函数表达式相比,可能存在一些...

    function, new function, new Function之间的区别

    ### JavaScript中的function, new function, new Function之间的区别 在JavaScript编程语言中,函数是一等公民,这意味着函数不仅可以作为值被赋给变量、作为参数传递给其他函数,甚至还可以被当作返回值从函数中...

    js中function函数的使用方法.docx

    ### JavaScript中的Function函数详解 #### 一、概述 在JavaScript编程语言中,`function`关键字是定义函数的基础。本文将详细介绍`function`的各种使用方法及其应用场景,帮助读者更深入地理解这一核心概念。 ###...

    ES6中new Function()语法及应用实例分析

    在JavaScript的ES6标准中,`new Function()`是一个不太常见的构造函数,用于动态创建函数。它的工作原理是接受一个或多个参数,这些参数分别代表函数的参数名,然后是一个字符串,这个字符串包含了函数的实现代码。...

    js中new一个对象的过程

    在JavaScript中,使用new关键字创建一个新对象的过程是一个涉及多个步骤的机制,其目的是构造一个新的实例对象。这个过程涉及几个关键的内部操作,理解它们有助于更好地掌握JavaScript的原型继承和面向对象编程。 1...

    聊聊new Function这个陌生面孔及函数作用域和函数执行顺序

    【标题】: "深入理解JavaScript中的new Function与函数作用域和执行顺序" 【描述】: 本文将探讨JavaScript中不常见的new Function构造函数的用法,以及函数的作用域和执行顺序这两个关键概念。通常,我们定义函数的...

    javascript Function

    ### JavaScript中的Function应用详解 #### 一、基本概念与用法 在JavaScript中,`Function` 是一个内置对象,它允许我们创建动态的函数。它不仅支持传统的函数声明,还能用于构建复杂的对象模型和实现一些高级特性...

    理解Javascript Function与Object

    在JavaScript中,Function和Object是两个非常重要的概念,它们之间存在着紧密的关系。在这篇文章中,我们将深入探讨Function和Object的关系,了解它们之间的联系和区别。 Function:函数对象 ---------------- 在...

    javascript使用eval或者new Function进行语法检查

    在没有专门的语法解析库的情况下,可以利用JavaScript自身提供的功能来进行简单的语法验证,如使用`eval()`或`new Function()`。 `eval()`方法是JavaScript中的一个函数,它能够将字符串作为JavaScript代码执行。在...

    邪恶的eval和new Function使用介绍

    Eval 和 new Function 是 JavaScript 中两个强大的函数,但是它们也可以被恶意使用,导致潜在的安全风险。在这篇文章中,我们将探讨 Eval 和 new Function 的邪恶使用介绍,以及它们可以干什么。 Eval 函数 Eval...

    JavaScript中的Function函数

    JavaScript中的Function函数是编程语言的核心组成部分,用于封装可重复使用的代码段。JavaScript的函数具有多种用途,包括事件驱动、作为类构造器、闭包以及在DOM操作中的选择器功能。以下将详细介绍JavaScript中的...

    JavaScript获取一个范围内日期的方法

    本文实例讲述了JavaScript获取一个范围内日期的方法。分享给大家供大家参考。具体分析如下: 指定开始和结束时间,范围该范围内的所有日期放入数组 Date.prototype.addDays = function(days) { var dat = new Date...

    关于eval 与new Function 到底该选哪个?

    在JavaScript编程中,`eval` 和 `new Function` 都被用来执行字符串化的JavaScript代码,但它们之间存在着一些重要的区别和使用场景上的考量。本文将深入探讨这两个函数的特性和性能差异,帮助开发者做出明智的选择...

    js中function()使用方法.docx

    ### JavaScript中的Function() 使用方法详解 #### 一、前言 在JavaScript中,函数是一种非常重要的数据类型。与许多其他编程语言不同,JavaScript中的函数被视为第一等公民,即它们不仅可以在程序中定义和调用,还...

    JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结

    本文将深入探讨JS对象与JSON的互换、New Function构造函数、forEach方法以及DOM事件流等核心知识点,同时还会涉及JavaScript的数据类型、运算符、Memoization技术及闭包。 1. **数据类型**: JavaScript提供了七种...

    js变量作用域

    在JavaScript中,局部变量是指在某个函数或块级作用域内定义的变量,其可见范围仅限于该函数或块。如果在一个函数内部不使用`var`、`let`或`const`声明变量,则该变量会自动提升为全局变量。 **示例代码**: ```...

Global site tag (gtag.js) - Google Analytics