javascript中不存在块级作用域,所以要小心使用在块级作用域中的函数声明所带来的作用域混乱.
在javascript中函数的作用域是一个非常重要的概念.
javascript中是没有块级作用域,但是有函数作用域的概念.
我们在开发的过程中,经常会遇到这样的问题,
某个函数我暂时不需要,不想声明,只有在特定的场合下,我才需要这个函数.才将这个函数体装载在我们的引擎中来.
function foo(){
return "全局的";
}
function test(x){
var result=[];
if(x){
function foo(){return "局部的";}
result.push(foo());
}
result.push(foo());
return result;
}
alert(test(true));//局部的,局部的
alert(test(false));//火狐:全局的 //IE和谷歌:局部的.对于这个地方出项的兼容性问题,我个人的观点是这样的才比较合理.
/*
最后一段代码出项的兼容性问题,我个人呢的观点是这样的觉得比较合理.
如果执行了if语句应该是"局部的".
如果没有执行if语句,结果应该是"全部的"
*/
上面的实例中有一个全局方法foo();
在test方法体中.当参数x为真时,声明一个局部函数,foo();
否则不声明局部函数foo();
很多人可能一开始得出的结论是,[局部的,全局的],[全局的]
其实结果是这样的[局部的,局部的],[全局的]
之所以会得出上面的错误的结论,可能是因为我们把if语句当成了一个有效的作用域.
觉得if语句中的成员不会被外部访问到.
对于上面的代码做一些修改的话,还是很好理解的.
/*
注:今天无意中发现以上的函数声明存在一定的兼容性,不建议大家这样使用^_^
*/
function foo(){return "全局的";}
function test(x){
var fun=foo,result=[];
if(x){
g=function(){return "局部的";}
result.push(fun());
}
result.push(fun());
return result;
}
alert(test(true));//全局的,全局的
alert(test(false));//全局的
如果你想编写嵌套函数声明,应该将它置于其父元素的最外层.
如果你需要有条件的选择函数,最好办法是使用var声明和函数表达式来实现.
而且这种写法的函数完全可移植.
javascript中不存在块级作用域,所以要小心使用在块级作用域中的函数声明所带来的作用域混乱.的更多相关文章
- JS函数声明与定义,作用域,函数声明与表达式的区别
Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); 上面这 ...
- 通过取父级for循环的i来理解闭包,iife,匿名函数
在使用for循环的时候,假如需要在循环体中添加一个匿名函数处理其他的事情,那么,在这个匿名函数内,如果需要用到对应的i,因为闭包的缘故,循环体循环结束后才返回i,所以i最终为最后一次++的数值. ...
- [Effective JavaScript 笔记]第15条:当心局部块函数声明笨拙的作用域
嵌套函数声明.没有标准的方法在局部块里声明函数,但可以在另一个函数的顶部嵌套函数声明. function f(){return "global"} function test(x) ...
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
- C/C++语言中变量作用域:局部变量,全局变量,文件级变量
C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...
- Javascript 函数及其执行环境和作用域
函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...
- JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题
<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的u ...
- JavaScript 之有趣的函数(函数声明、调用、预解析、作用域)
前言:“函数是对象,函数名是指针.”,函数名仅仅是指向函数的指针,与其他包含函数指针的变量没有什么区别,话句话说,一个函数可能有多个名字. -1.函数声明,function+函数名称.调用方法:函数名 ...
- JavaScript之变量(声明、解析、作用域)
声明(创建) JavaScript 变量 在 JavaScript 中创建变量通常称为"声明"变量. 一.我们使用 var 关键词来声明变量: var carname; 变量声明之 ...
随机推荐
- python 读取位于包中的数据文件
假设你的包中的文件组织成如下: mypackage/ __init__.py somedata.dat spam.py 现在假设spam.py文件需要读取somedata.dat文件中的内容.你可以用 ...
- Vue.js 计算属性是什么
Vue.js 计算属性是什么 一.总结 一句话总结: 模板 表达式 维护 在模板中表达式非常便利,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护 ...
- dbms_job.submit方式创建job,太老了
--方法一declarejobno number; begin dbms_job.submit(jobno, 'xxxx;', xxxx, 'xxxx'); commit ...
- 从排序后的结果集中删除 前n条记录
端午有人休息,有人忙 操作前数据: --从排序后的结果集中删除 前n条记录delete from emp where empno in (select empno ...
- [转载]字符串匹配的KMP算法
作者: 阮一峰 日期: 2013年5月 1日 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另 ...
- JAVA实现Excel导入/导出【转】
JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...
- 简单使用dom4j
package com.dom4j; import java.io.FileWriter; import java.io.IOException; import java.io.Unsupported ...
- Git Error: warning: refname 'origin/branch-name' is ambiguous.
When this happened, it created the file .git/refs/heads/origin/branch-name. So, I just deleted the f ...
- DesignPattern(一)设计模式的六个基本原则
使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替原则.依赖倒置原则.接口隔离原则. ...
- 《DSP using MATLAB》示例 Example 9.11
代码: %% ------------------------------------------------------------------------ %% Output Info about ...