`
jindw
  • 浏览: 512333 次
  • 性别: 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上了

相关推荐

    H.rar_H-fox_H函数_fox H 函数_fox-H函数_双变量fox

    双变量Fox's H函数则是在单变量Fox's H函数基础上扩展而来的,用于处理两个独立变量(如时间和空间)的情况。在自由空间光通信中,这可能对应于时间上的光强波动和空间上的光束扩散。这种双变量特性使得H函数在分析...

    高斯随机变量的特征函数

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

    如何在对话框类内调用视图cview类中的函数和变量

    "如何在对话框类内调用视图CView类中的函数和变量" 在SDI程序中,经常需要在对话框类中调用视图CView类中的函数和变量。下面将详细介绍如何实现这一点。 首先,需要了解SDI程序的结构。SDI程序中有三个主要类:...

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

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

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

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

    全局变量的使用,函数func1中引用全局变量count,函数func1中调用函数func2

    在给定的描述中,提到了两个函数——`func1`和`func2`,以及两个变量——全局变量`count`和局部变量`temp`。首先,全局变量`count`在程序的开头定义,它的作用域覆盖了整个源代码文件,无论是在哪个函数内部,只要...

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

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

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

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

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

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

    基于Copula联结函数的两变量洪水频率分析

    基于Copula联结函数的两变量洪水频率分析,吕艳军,,采用二维Archimedean Copula 函数中的Gumbel-Hougaard Copula函数和Clayton Copula函数来研究红水河流域某个站点的洪峰流量Q和15天洪水总量V15及洪峰�

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

    在 MATLAB 中,变量可以分为局部变量和全局变量。局部变量是指在函数内部使用的变量,这些变量只在函数内部有效,一旦函数返回,这些变量将自动清除。全局变量是指在整个程序中都起作用的变量,可以使用 global 来...

    php变量缓存到文件的函数

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

    vb的示例程序自定义函数、变量应用、单元格条件颜色等

    在VB(Visual Basic)编程环境中,自定义函数和变量的应用是构建高效代码的关键元素,而单元格条件颜色则涉及到用户界面的美化和数据可视化。在这个VB示例程序中,我们将深入探讨这些知识点。 首先,自定义函数是VB...

    利用subs函数对符号表达的变量进行替换求值

    例如,假设在 Matlab 工作空间中存在变量 a = 980 和 C2 = 3时,使用 subs 函数可以对符号表达式 y = C2/exp(a*t) 中的变量 a 进行替换求值。 y = dsolve('Dy = -a*y'); a = 980; C2 = 3; subs(y) 输出结果:ans =...

    python 实现函数交换变量

    # 题目:两个变量值用函数互换。

    C语言从入门到精通视频教程下载第10章 函数中的变量.zip

    虽然全局变量提供了跨函数的数据共享,但过度依赖全局变量可能导致代码难以理解和维护,因此在编程实践中,一般推荐优先使用局部变量和函数参数。 函数参数也是一种传递数据的方式。在C语言中,参数传递主要有两种...

    第2章:VC程序设计基础——变量与函数

    变量的作用域有六种:块作用域、函数作用域、类作用域、命名空间作用域、文件作用域和程序作用域。块作用域的变量只在其定义的花括号内有效,如if或for语句中定义的变量。函数作用域的变量在函数内部有效,如形式...

    1.10-函数的参数和变量的作用域

    函数的参数和变量的作用域是理解Python代码如何运行的关键概念。在这篇文章中,我们将深入探讨这两个主题。 首先,让我们理解什么是函数参数。在Python中,当我们定义一个函数时,可以指定一些参数(或称形参),...

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

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

Global site tag (gtag.js) - Google Analytics