`
jindw
  • 浏览: 508338 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

函数申明和变量申明的微妙区别

阅读更多
<script>
var test1 = 1;
function test1(){};//函数申明不能覆盖变量申明?
alert(test1);
</script>
<script>
var test2 = 1;
eval('function test2(){};');
alert(test2);//函数申明怎么又覆盖了变量申明?
</script>
分享到:
评论
8 楼 jindw 2007-05-09  
没找到合适的解释
7 楼 jindw 2007-05-09  
12.2 Variable statement Description
If the variable statement occurs inside a FunctionDeclaration, the variables are defined with function-local
scope in that function, as described in s10.1.3. Otherwise, they are defined with global scope (that is, they
are created as members of the global object, as described in 10.1.3) using property attributes { DontDelete
}. Variables are created when the execution scope is entered. A Block does not define a new execution
scope. Only Program and FunctionDeclaration produce a new scope. Variables are initialised to undefined
when created. A variable with an Initialiser is assigned the value of its AssignmentExpression when the
VariableStatement is executed, not when the variable is created.


函数申明:
Semantics
The production FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }
is processed for function declarations as follows:
1. Create a new Function object as specified in 13.2 with parameters specified by FormalParameterList, and
body specified by FunctionBody. Pass in the scope chain of the running execution context as the Scope.
2. Create a property of the current variable object (as specified in 10.1.3) with name Identifier and value
Result(1).
6 楼 jindw 2007-05-09  
2007-05-09 18:49 
2007-05-09 18:52 
又一次把java eye当QQ用了

to dlee:
这些东西在ECMA262-3里面有描述吗?
我初看一下,没找到呢。
5 楼 dlee 2007-05-09  
是的,这就是上面我最后补充的一句话的情况:
引用
当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。
4 楼 jindw 2007-05-09  
呵呵,还有更奇怪的。

<script> 
alert(test1());//这样也行???? 
var test1 = 1; 
function test1(){return 'xxx'};
</script> 
3 楼 dlee 2007-05-09  
不是这个意思,出现这个情况的原因是这样:对于页面中的脚本,JavaScript引擎一般是先执行完所有外部的代码之后,才会创建声明的函数的。
所以jindw上面的第一段代码,其实相当于是:
<script>
var test1 = 1;
alert(test1);
function test1(){};//函数申明不能覆盖变量申明?
</script>

而第二段代码呢,
<script>
var test2 = 1;
eval('function test2(){};');
alert(test2);//函数申明怎么又覆盖了变量申明?
</script>

因为eval这条语句属于外部代码,所以执行的顺序与jindw写的顺序是相同的。

当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。
2 楼 sp42 2007-05-09  
var test2 = 1;
eval('test2=new Function();')
alert(test2);
如果这样就可以覆盖掉了(指向一个匿名函数)
1 楼 sp42 2007-05-09  
估计是eval()内部apply()了一下,把这个function挂到window上了

相关推荐

    高斯随机变量的特征函数

    高斯随机变量是服从正态分布的随机变量,其概率密度函数具有对称性和钟形特性,中心峰值位于均值处,方差决定了分布的宽度。 正态分布的概率密度函数(PDF)可以表示为: \[ f(x|\mu,\sigma^2) = \frac{1}{\sqrt{2\...

    408函数-递归调用-全局变量和局部变量

    ### 408函数-递归调用-全局变量和局部变量 #### 一、CLion环境下新建文件及函数管理 在CLion环境下新建文件,尤其是C/C++源文件,对于项目的组织和代码的管理非常关键。为了提高编程效率和调试效果,我们需要遵循...

    随机数个相互独立的随机变量之和的分布函数

    在概率论和统计学中,随机变量的分布函数是用来描述随机变量取值的概率规律的函数。当我们面对多个相互独立的随机变量时,了解它们之和的分布函数就变得尤为重要,因为这有助于我们理解和分析这些随机变量共同作用的...

    matlab构造含符号变量的函数并求值

    在MATLAB中,符号变量和符号函数的使用是数学建模和符号计算的重要部分。本文将详细介绍如何在MATLAB中构造含符号变量的函数并进行求值。 首先,我们需要了解什么是符号变量。在MATLAB中,符号变量允许我们进行符号...

    C# lua库 支持中文函数名中文变量

    本文将深入探讨“C# lua库 支持中文函数名中文变量”这一主题,基于lua 5.1版本,我们将讨论如何在C#中集成Lua,并支持中文的函数名和变量名。 首先,Lua是一种轻量级的脚本语言,以其简洁的语法和高效的执行性能而...

    python类和函数中使用静态变量的方法

    在Python编程语言中,类和函数的静态变量通常是指那些在多次调用中保持其值不变的变量。静态变量在其他面向对象的语言如Java或C#中比较常见,但在Python中,由于其动态特性的存在,实现静态变量的方式稍有不同。本篇...

    linux常用c函数 环境变量篇.txt

    ### Linux C函数环境变量...这些函数在编写Linux下的C程序时非常有用,可以帮助我们更灵活地管理和利用环境变量。在实际编程过程中,应当注意函数的正确调用顺序,并妥善处理错误情况,以确保程序的健壮性和安全性。

    MATLAB自定义函数及局部变量.docx

    在MATLAB中,变量可以分为局部变量和全局变量。如果一个函数内的变量没有特别声明,那么这个变量只在函数内部使用,即为局部变量。如果两个或多个函数共用一个变量(或者说在子程序中也要用到主程序中的变量,注意...

    LIN API共用函数库和变量定义

    针对日本瑞莎单片机r8c/23 开发的LIN网络通讯程序包括主节点和从节点,此文件为共用函数库和变量定义

    二维随机变量分布函数习题

    2. **联合分布函数和边缘分布函数**:联合分布函数F(x, y)给出了二维随机变量(X, Y)所有可能值的概率,而边缘分布函数F_X(x)和F_Y(y)分别表示X和Y的单独分布,可以通过对另一个变量积分得到,即F_X(x) = ∫F(x, y)dy...

    php变量缓存到文件的函数

    php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。...

    authorware变量、函数大全

    用法 numlist=[1,2,3] AddLinear(numList,99,1) NumList为[99,1,2,3] numList:=[1,2,3] Addlinear(numList,99,6) NumList为[1,2,3,0,0,99] 相关函数 参见系统函数SortByProperty和SortByValue。

    函数自变量取值范围专题练习.doc

    这些知识点涵盖了函数自变量取值范围的基本原则和方法。在解决实际问题时,我们需要根据函数的具体形式,结合这些原则来确定自变量的允许取值。通过这些练习题,我们可以加深对函数定义域的理解,并能熟练地求解复杂...

    基于Python函数和变量名解析

    函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构,用于将相关功能打包并参数化 Python中可以创建4种函数: 1)、全局函数:定义在模块中,每个模块都是一个全局作用域,因此,全局作用域...

    复杂函数申明解析

    在C或C++编程语言中,函数声明的解析尤其是复杂声明的解析对于初学者和经验丰富的程序员都可能是个挑战。本文将带领读者逐步解析C/C++中的复杂函数声明,包括使用typedef、const关键字以及函数指针的高级用法,并...

    3.8 函数参数与变量的作用域(ppt).zip

    在编程语言中,函数参数与变量的作用域是至关重要的概念,它们直接影响到代码的可读性、维护性和正确性。作用域定义了变量在程序中的可见范围,而函数参数则是函数接收输入数据的方式。让我们深入探讨这两个主题。 ...

    JavaScript闭包函数访问外部变量的方法

    为了更加清晰地理解闭包和匿名函数在访问外部变量时的区别,我们可以参考两个经典的例子。第一个例子是通过数组存储闭包,然后遍历数组执行闭包,观察闭包对变量的引用情况。第二个例子是通过绑定事件处理器的方式,...

    Perl常用函数&特殊变量

    Perl常用函数&特殊变量,便于查阅

    人教版八年级下册数学教案:19.1.1变量与函数第一课时变量与常量.docx

    本节课的主要目标是让学生理解变量和常量的概念,并学习如何用一个变量表示出另一个变量。通过本节课的学习,学生将能够说出变量和常量的概念,并能够自己用一个变量表示出另一个变量。 变量是指在一个变化过程中,...

    在MFC下如何定义全局变量和全局函数

    在MFC(Microsoft Foundation Classes)框架下开发应用时,全局变量和全局函数的定义与普通C++项目有所不同,因为MFC项目的结构更为复杂,通常由多个文件构成,直接在类外部定义全局变量可能会导致编译错误或者链接...

Global site tag (gtag.js) - Google Analytics