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 获取进程执行的结果
import subprocessp = subprocess.Popen([r'ls'],stdout=subprocess.PIPE) result = p.stdout.read()print( ...
- Flex 布局的各属性取值解释
Flex布局是一种弹性布局.布局样式比较灵活,大多数情况下可以替代float,而且不会脱离文档里流. Flex中定义了两个轴线,一个主轴一个副轴,这个概念你可以想想屏幕坐标系(X轴向右,Y轴向下),F ...
- docker 安装mysql mongo
Docker安装Mysql 1.拉取镜像 docker pull mysql/mysql-server 2.运行mysql docker run -d -p : --name [Name] [Imag ...
- Java中处理异常的9个最佳实践
Java中的异常处理不是一个简单的话题.初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常. 这就是为什么大多数开发团队都有自己的异常处理的规则和方法.如果你是一个团队 ...
- C#删除图片问题
public Image GetImage(string path) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess. ...
- xtrabackup三种备份和还原(一)
写这边博客心情不是太美好(博客已经停更2个多月了,实在是没心情学习新东西.2018我的黑暗年,呵呵)好了,不废话了,本文没有任何原理的部分,我也是刚开始接触xtrabackup这个工具.本文应该是一个 ...
- C++设计模式之组合模式
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- Webroot SecureAnywhere AntiVirus 2014 – 免费6个月
Webroot SecureAnywhere 是由webroot推出的一款云安全软件,除了能够清除病毒外,特点是体积小.强力查杀木马.间谍软件.Rootkit 等等,为你的个人私隐信息提供全面的保护. ...
- Field 'id' doesn't have a default value 原因
Field 'id' doesn't have a default value昨晚做项目的时候遇到一个问题,在测试数据存储的时候老是报Field 'id' doesn't have a default ...
- tensorflow :ckpt模型转换为pytorch : hdf5模型
参考链接:https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py import tensorflow as tf ...