JS作用域与闭包--实例
<script>
"use strict"
//函数作用域
function func(){
var arr = [1,3,5,7,9];
var sum = 0;
for(var i = 0,len = arr.length;i < len;i ++){
sum += arr[i];
}
console.log("%d\t\n%d",i,sum);
}
func();
//
//
//闭包特性
var outter = [];
function clouseTest(){
var arr = ["one","two","three","four"];
for(var i = 0, len = arr.length;i < len;i ++){
var x = {};
x.no = i;
x.text = arr[i];
x.invoke = function(){
console.log("%d\t\n%o\t\n%d\t\n",i,this,this.no);
};
outter.push(x);
}
}
clouseTest();
for(var i = outter.length - 1;i >= 0;i --){
outter[i].invoke();
}
//
//Object { no=3, text="four", invoke=function()}
//
//
//Object { no=2, text="three", invoke=function()}
//
//
//Object { no=1, text="two", invoke=function()}
//
//
//Object { no=0, text="one", invoke=function()}
//
//关于i输出的都是4的解释:因为,在每次迭代的时候这样的语句x.invoke=function(){console("%d",i);}并没有
//被执行,只是构建了一个函数体为“console.log("%d",i);”的函数对象,如此而已。而当i = 4时,迭代停止,外部函数返回
//当再去调用outter[i].invoke()时,i的值依旧为4,因此outter数组中的每一个元素的invoke都返回i的值为4.
//引用
var obj = {};//空对象
var ref = obj;//引用
obj.name = "objectA";//
console.log(ref.name);//ref跟着刚添加的name属性
obj = ["one","two","three","four"];//obj指向了另一个对象(数组对象)
console.log(ref.name);//ref还指向原来的对象
console.log(obj.length);//
console.log(ref.length);//undefined
//objectA
//objectA
//
//undefined
//作用域问题:内部函数可以访问外部函数中的变量,(在非严格模式下,当此时内部函数中的this却是指向window)
var name = "window";
function wrapper(){
var name = "wrapper";
function inner(){
console.log('%s',name);//wrapper
console.log('%o',this);//在严格模式( use strict)下是 undefined,否则指向 window
//console.log('%s',this.name);//在严格模式(use strict)下,是undefined error,否则是 'window'
}
inner();
}
wrapper();
function wrapper2(){
var name = "local";
return function(){
console.log('%s',name);//local
console.log('%o',this);//在严格模式( use strict)下是 undefined,否则指向 window
//console.log('%s',this.name);//在严格模式(use strict)下,是undefined error,否则是 'window'
};
}
wrapper2()();
</script>
JS作用域与闭包--实例的更多相关文章
- JS作用域与闭包
JS作用域与闭包 在JavaScript中,作用域是可访问变量,对象,函数的集合. 变量分为全局变量和局部变量.全局变量在函数外定义,HTML中全局变量是window对象,所有数据对象都属于windo ...
- js——作用域和闭包
1. js是编译语言,但是它不是提前编译,编译结果不能在分布式系统中移植.大部分情况下,js的编译发生在代码执行前的几微秒(甚至更短) 2. 一般的编译步骤 分词/词法分析:把字符串分解成词法单元 ...
- js作用域及闭包
作用域 执行环境是js最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为. 1.全局执行环境就是最外围的一个执行环境,每一个函数都有自己的作用域 2.简单的说局部作用 ...
- js基础(闭包实例)
1,常用发送短信的闭包实现: function sms() { var count = 60; return { start: function() { if(count == 0) { count ...
- 浅谈JS作用域和闭包
函数表达式和函数声明 变量/函数声明都会提前 console.log(a) let a =1 那么打印出来的a为 undefined,因为会将a提到前面并赋予默认值undefined 函数声明:函数声 ...
- JS教程:词法作用域和闭包 (网络资源)
varclassA = function(){ ; } classA.prototype.func1 = function(){ var that = this, ; function a(){ re ...
- js 作用域,作用域链,闭包
什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...
- 解析js中作用域、闭包——从一道经典的面试题开始
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...
- 你不知道的JS之作用域和闭包(五)作用域闭包
原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...
随机推荐
- IOS UI 笔记整理回顾
注意手势会冒泡上抛,一个view没有实现的手势,如果父类view有实现,父视图就处理,如果不想让父视图处理,就把本视图添加到底层window上 setMasksToBounds:YES imageVi ...
- 关于CSS伪类选择器
#CSS伪类选择器 ##使用css伪类选择器需要注意的 使用css的伪类选择器来选择某元素时,需要特别注意 :first-child 和 :nth-child(n) 等时, 网页渲染是从语句的后面开始 ...
- @Resource和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- rolling hash
也是需要查看,然后修改,rolling hash, recursive hash, polynomial hash, double hash.如果一次不够,那就2次.需要在准备一个线段树,基本的线段树 ...
- Poj 3062 Celebrity jeopardy
1.Link: http://poj.org/problem?id=3062 2.Content: Celebrity jeopardy Time Limit: 1000MS Memory Lim ...
- Android开发技巧:像QQ一样输入表情图像
EditText和TextView一样,也可以进行图文混排.所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示, 也可混合输入文字和图像,让我们先回顾一下图5.2所示的 ...
- cron以及在laravel中使用cron
yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...
- Nat网络地址转换
Nat中的术语 -------------------------------------------------------------------------------------------- ...
- Custom Control
How to create custom control http://www.silverlightshow.net/items/Creating-a-Silverlight-Custom-Cont ...
- 通过MyEclipse生成Hibernate类文件和hbm.xml文件,或者annotation文件
1. 前言 很多人都在使用myEclipse,很多公司也都使用hibernate框架,老版本的hibernate中,由于没有annotation,我们需要写两个文件来维护表与对象的关系,写一个类, ...