JavaScript闭包学习笔记
此文都是大牛们关于闭包的观点,在此只是总结。
闭包应用的两种情况即可——函数作为返回值,函数作为参数传递。
判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。
对象里面的一切都是属性,只有属性,没有方法。方法也是一种属性。因为它的属性表示为键值对的形式。
javascript中的对象可以任意的扩展属性。
var obj={
a : 10,
b : function(x){
return this.a+x;
}
c:{
name:'王',
year:1999
}
}
var fn = function () {
alert(100);
};
fn.a = 10;
fn.b = function () {
alert(123);
};
fn.c = {
name: "王",
year: 1988
};
一切(引用类型)都是对象,对象是属性的集合
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
在函数外部自然无法读取函数内的局部变量。
Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
闭包就是能够读取其他函数内部变量的函数。
可以把闭包简单理解成"定义在一个函数内部的函数"。
最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象?函数中的this指的是调用这个函数的owner
思考题很关键呀~
现在比较让人认同的闭包实现有如下三种
with(obj){
//这里是对象闭包
}
(function(){
//函数闭包
})()
try{
//...
} catch(e) {
//catch闭包 但IE里不行
}
让这三个节点的Onclick事件都能正确的弹出相应的参数。
1 使用函数闭包。
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick = (function(i){//保存于外部函函数
return function(){
alert(i);
}
})(i);
}
2 利用事件代理
var ul = document.getElementsByTagName("ul")[0];
ul.onclick = function(){
var e = arguments[0] || window.event,
target = e.srcElement ? e.srcElement : e.target;
if(target.nodeName.toLowerCase() == "li"){
alert(target.id.slice(-1))
}
}
slice() 方法可从已有的数组中返回选定的元素。包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
东西太多,看不明白了,先mark上吧~
JavaScript闭包学习笔记的更多相关文章
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- javascript正则表达式 - 学习笔记
JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...
- JavaScript简易学习笔记
学习地址:http://www.w3school.com.cn/js/index.asp 文字版: https://github.com/songzhenhua/github/blob/master/ ...
- javaScript 对象学习笔记
javaScript 对象学习笔记 关于对象,这对我们软件工程到学生来说是不陌生的. 因为这个内容是在过年学到,事儿多,断断续续,总感觉有一丝不顺畅,但总结还是要写一下的 JavaScript 对象 ...
- 【MarkMark学习笔记学习笔记】javascript/js 学习笔记
1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...
- Javascript闭包学习(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...
- Js闭包学习笔记
好多内容摘抄了大神的博客内容,只为分享记录.如有冒犯,请见谅 参考文章 http://www.cnblogs.com/libin-1/p/5962269.html http://www.cnblogs ...
- Javascript MVC 学习笔记(一) 模型和数据
写在前面 近期在看<MVC的Javascript富应用开发>一书.本来是抱着一口气读完的想法去看的.结果才看了一点就傻眼了:太多不懂的地方了. 仅仅好看一点查一点,一点一点往下看吧,进度虽 ...
- Javascript作用域学习笔记(三)
看完<你不知道的javascript>上,对作用域的新的理解(2018-9-25更) 一.学习笔记: 1.javascript中的作用域和作用域链 + 每个函数在被调用时都会创建一个 ...
随机推荐
- ShareSDK第三方登录代码
- (IBAction)YYSJBut:(UIButton *)sender{ if (sender.tag == 7) { [self AuthLogin:SSDKPlat ...
- 安装eclipse插件时出现问题
有时候我们安装eclipse插件时,会无法找到repository,这个时候去除掉多余的包,可能就行了.以下例子是安装spring插件,如果全选的话无法安装所有的插件,最终会失败 2.这时我们可以去掉 ...
- spring aop搭建redis缓存
SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做 ...
- 线程池ExecutorService和完成服务CompletionService的使用获取线程的返回结果
package com.suning.ecif.admin.app.impl.temp; import java.util.ArrayList;import java.util.Collection; ...
- JQuery_高级选择器
在很多特殊的元素上,比如父子关系的元素,兄弟关系的元素,特殊属性的元素等等. 在早期 CSS 的使用上,由于 IE6 等低版本浏览器不支持,所以这些高级选择器的使用也不具备普遍性,但随着 jQuery ...
- HBase之表状态
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...
- python3 登录接口
登录接口 功能: 输入用户名(有一个用户名及对应的密码表) 认证成功后显示欢迎信息 输错三次后锁定(即第四次提示该账户已被锁定)用户登录锁定记录写到一个文件中. 用到:自定义函数.列表.字典 #Au ...
- TestLink
TestLink的主要功能包括: 测试需求管理 测试用例管理 测试用例对测试需求的覆盖管理 测试计划的制定 测试用例的执行 大量测试数据的度量和统计功能 TestLink的主要特色包括: 支持多产品或 ...
- flask 程序结构概括
以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...
- 学习笔记:UpdatePanel控件
Asp.net UpdatePanel 允许用户构建一个丰富的,以客户端为中心的应用程序,引用UpdatePanel控件,能够实现页面的部分刷新,一个包含scriptManage和 UpdatePan ...