javascript秘密花园,css秘密花园
千锋教育前端开发学习网站有哪些
视频类:
1、lynda.com(英文网站、视频质量高、收费)
2、慕课网(所有教程免费,里面的讲师都很不错,课程很多)
3、百度传客(部分收费,资源不错)
4、网易云课堂(这个部分视频要收费)
5、极客学院(这个是收费的)
手册、文字教程类:
1、MDN 有很多教程、示例,更新及时
2、w3school:提供完整的建站教程,包括:HTML、CSS、TCP/IP、JS、PHP、SQL等,教程是文字教程,
提供在线代码测试,非常方便便于理解。
3、Jquery中文手册,支持搜索,内容全面。
4、HTML Dog:英文网站,在线学习HTML、CSS和JS
5、thinkjs 参考手册(thinkjs是基于Promise的Node.js MVC框架)
6、ES6教程(全面介绍ECMAScript 6新引入的语法特性。)
7、javascript的秘密花园
8、菜鸟教程(网站开发各方面教程)
9、百度Echarts 开源图表库
echarts.baidu.com/index.html
10、css-hack css教程 很多css知识点都有详细的说明
论坛、社区类:
1、Stack Overflow 问答网站,提供优质的问题解答
2、segmentFault 问答网站,提供优质的问题解答
3、Github 开源代码库 代码分享 反映技术潮流 推荐!(点击查看github的介绍与使用 点击查看Git的使用)
4、开源中国社区 代码分享 反映技术潮流 推荐!
5、Google Code 代码分享 反映技术潮流 推荐!
(资源整理)
6、apache 代码分享 反映技术潮流 推荐!
7、CSDN IT社区
博客、资讯类:
1、淘宝UED
2、OPEN资讯
3、豪情的博客(里面有很多干货,有很多学习经验的分享)
4、前端分享网
5、jser的博客
(他的前端导航站不能更棒!)
其他:
1、icon图标(这里所有需要的图标)
2、很有趣的闯关游戏,可以来试试
3、前端资源网址导航
4、前端资源汇总(来自知乎)
5、外国妹子180天做的180个网站,好棒!
6、支持在线检查标记语言的网站
7、javascript练习通关(可以判断答案是否正确,还有其他语言的学习)
8、webstorm快捷键
完整快捷键 速查卡
9、less、sass的编译工具-koala

JavaScript闭包会造成内存泄漏吗?
先讲讲什么闭包吧,讲完或许题主自己就有答案了。
闭包并不是JS的特色功能, 追究起来,它是一个计算机基础概念,如果想深入理解还真要费那么点工夫.
在理解闭包之前, 首先要清楚JS中的作用域只有2种: 全局作用域和方法作用域
全局作用域很好理解了, 方法作用域就是指一个 function 形成一个独立的作用域, 而且方法作用域还能够嵌套.
与别的语言不同的是: 花括号({})不能形成一个独立的作用域, 例如Java中的作用域.
下面我们举例说说作用域
var g = 0;
function f() {
? ?// 这里面就形成了一个方法作用域, 能够保护其中的变量不能被外部访问
? ?// 方法作用域能够访问全局作用域
? ?var a = 1;
? ?console.log(g);
? ?// 嵌套方法作用域
? ?function ff() {
? ? ? ?// 这里面再度形成了一个方法作用域
? ? ? ?// 其中可以访问外部的那个方法作用域
? ? ? ?var aa = 2;
? ? ? ?console.log(a);
? ?}
? ?// 出了 ff 的作用域就不能访问其中的东西了
? ?// console.log(aa); // 报错 ReferenceError: aa is not defined
}
f();
// console.log(a); // 报错 ReferenceError: a is not defined
弄清楚作用域的问题后, 我们就可以开始聊聊闭包了.
我们以最经典的for循环为例来讲解. 大家可以试试下面这段代码, 取自JavaScript 秘密花园循环中的闭包
for(var i = 0; i 10; i++) {
? ?setTimeout(function() {
? ? ? ?console.log(i);
? ?}, 1000);
}
如果在运行前, 你没有猜到正确答案, 那就对了...
1. 首先说说为什么最终输出的是10次10, 而不是你想象中的 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
? 因为setTimeout是异步的!
? 你可以想象由于setTimeout是异步的, 因此我们将这个for循环拆成2个部分
? 第一个部分专门处理 i 值的变化, 第二个部分专门来做setTimeout
? 因此我们可以得到如下代码
? // 第一个部分
? i++;
? ...
? i++; // 总共做10次
? // 第二个部分
? setTimeout(function() {
? ? ?console.log(i);
? }, 1000);
? ...
? setTimeout(function() {
? ? ?console.log(i);
? }, 1000); // 总共做10次
? 这样一拆后, 我相信你肯定知道之前那个for循环的运行结果了.
? 由于循环中的变量 i 一直在变, 最终会变成10, 而循环每每执行setTimeout时, 其中的方法还没有真正运行, 等真正到时间执行时, i 的值已经变成 10 了!
? i 变化的整个过程是瞬间完成的, 总之比你异步要快, 就算你setTimout是0毫秒也一样, 会先于你执行完成.
? for(var i = 0; i 10; i++) {
? ? ? setTimeout(function() {
? ? ? ? ? console.log(i);
? ? ? }, 0);
? }
2. 那么为什么setTimeout中匿名function没有形成闭包呢?
? 因为setTimeout中的匿名function没有将 i 作为参数传入来固定这个变量的值, 让其保留下来, 而是直接引用了外部作用域中的 i, 因此 i 变化时, 也影响到了匿名function.
? 因此如果我们定义一个外部函数, 让 i 作为参数传入即可"闭包"我们要的变量了!!
? for (var i = 0; i 10; i++) {
? ? ? // 注意关键是我们把想要闭包的值当参数传入一个方法
? ? ? // 这个方法 return 一个新的方法 -- 闭包!!
? ? ? setTimeout(fn(i), 1000);
? }
? function fn() { // 为了深刻理解闭包, 这个函数我没有用参数
? ? ? // 神奇的"闭包"发生在这一步, 其实就是作用域和值复制在起了关键作用,
? ? ? // 对于数字/字符等类型是复制值, 而不是引用
? ? ? var a = arguments[0];
? ? ? return function() {
? ? ? ? ? console.log(a); // 注意现在我操作的变量已经变成 a 了,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 已经和 i 没有半毛线关系了!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 而 a 的值就是当时执行时赋予的一个确定值,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不会因 i 的变化而变化了!
? ? ? };
? }
3. 再换成更简洁的方式看你能不能真正理解闭包
? for (var i = 0; i 10; i++) {
? ? ? (function(a) {
? ? ? ? ? // 变量 i 的值在传递到这个作用域时被复制给了 a,
? ? ? ? ? // 因此这个值就不会随外部变量而变化了
? ? ? ? ? setTimeout(function() {
? ? ? ? ? ? ? console.log(a);
? ? ? ? ? }, 1000);
? ? ? })(i); // 我们在这里传入参数来"闭包"变量
? }
这就是我所理解的闭包, 简单点说就是专门用来"包养"变量的.
我就是上面的那个变量 i, 求"包养"
真正理解了作用域也就理解了闭包.
所以,你觉得会泄露吗?
GitHub 上有哪些值得推荐的开源电子书
语言无关类
操作系统
鸟哥的Linux私房菜 (简体)
Linux 系统高级编程
The Linux Command Line (中英文版)
Linux 设备驱动 (第三版)
深入分析Linux内核源码
UNIX TOOLBOX
Docker中文指南
Docker —— 从入门到实践
FreeRADIUS新手入门
Mac 开发配置手册
FreeBSD 使用手册
Linux 命令行(中文版)
智能系统
一步步搭建物联网系统
web服务器
Nginx开发从入门到精通 (淘宝团队出品)
版本控制
Git教程 (本文由 ?@廖雪峰 创作,如果觉得本教程对您有帮助,可以去 ?iTunes 购买)
git – 简易指南
猴子都能懂的GIT入门
Git 参考手册
Pro Git
Git Magic
GotGitHub
Git Community Book 中文版
Mercurial 使用教程
HgInit (中文版)
沉浸式学 Git
Git-Cheat-Sheet (感谢 @flyhigher139 翻译了中文版)
GitHub秘籍
NoSQL
NoSQL数据库笔谈 (PDF)
Redis 设计与实现
Redis 命令参考
带有详细注释的 Redis 3.0 代码
带有详细注释的 Redis 2.6 代码
The Little MongoDB Book
The Little Redis Book
Neo4j 简体中文手册 v1.8
Neo4j .rb 中文资源
MySQL
MySQL索引背后的数据结构及算法原理
项目相关
持续集成(第二版) (译言网)
让开发自动化系列专栏
追求代码质量
selenium 中文文档
Joel谈软件
约耳谈软体(Joel on Software)
Web
关于浏览器和网络的 20 项须知
前端知识体系
浏览器开发工具的秘密
Chrome 开发者工具中文手册
Chrome扩展开发文档
Grunt中文文档
移动Web前端知识库
正则表达式30分钟入门教程
前端开发体系建设日记
移动前端开发收藏夹
JSON风格指南
HTTP 接口设计指北
前端资源分享(一)
前端资源分享(二)
前端代码规范 及 最佳实践
w3school教程整理
大数据
大数据/数据挖掘/推荐系统/机器学习相关资源
编程艺术
程序员编程艺术
每个程序员都应该了解的内存知识(译)【第一部分】
取悦的工序:如何理解游戏 (豆瓣阅读,免费书籍)
其他
OpenWrt智能、自动、透明翻墙路由器教程
语言相关类 AWK
awk程序设计语言
C/C++
C++ 并发编程指南 (@傅海平ICT)
Linux C编程一站式学习 (宋劲杉, 北京亚嵌教育研究中心)
CGDB中文手册
100个gdb小技巧
100个gcc小技巧
ZMQ 指南
How to Think Like a Computer Scientist (中英文版)
跟我一起写Makefile(PDF)
GNU make中文手册
GNU make 指南
Google C++ 风格指南
C/C++ Primer (by @andycai)
简单易懂的C魔法
Cmake 实践 (PDF版)
C++ FAQ LITE(中文版)
C++ Primer 5th Answers
CSS/HTML
学习CSS布局
通用 CSS 笔记、建议与指导
CSS参考手册
Emmet 文档
前端代码规范 (腾讯alloyteam团队)
Dart
Dart 语言导览
Fortran
Fortran77和90/95编程入门
Java
实时 Java 系列
Apache Shiro 用户指南
使用 Eclipse 和 Java SE 6 创建独立 Web Services 应用程序
第 1 部分: Web Services 服务端应用程序
第 2 部分: Web 服务客户端应用程序
JavaServer Faces 1.2 入门
第 1 部分: 构建基本应用程序
第 2 部分: JSF 生命周期、转换、检验和阶段监听器
用 Eclipse Europa 进行 Web 开发
第 1 部分: Eclipse Java EE
第 2 部分: PHP 开发工具
第 3 部分: Ruby Development Toolkit 和 RadRails
使用 JavaServer Faces 构建 Apache Geronimo 应用程序
第 1 部分: 使用 Eclipse 和 Apache MyFaces Core 构建基本的应用程序
第 2 部分: 在 JavaServer Faces 中使用 Tomahawk
第 3 部分: 使用 ajax4jsf 添加 Ajax 功能
第 4 部分: 使用 Apache Trinidad 组件扩展 JSF
第 5 部分: 将 JSF 应用程序与 Spring 集成
Apache Geronimo 和 Spring 框架
第 1 部分: 开发方法学
第 2 部分: 构建第一个应用程序
第 3 部分: 集成 DAO 与 ORM
第 4 部分: 混合使用 Spring AOP 和 Spring Web Flow
第 5 部分: Spring MVC
第 6 部分: Spring MVC:使用 Web 视图技术
终极 mashup —— Web 服务和语义 Web
第 1 部分: 使用与组合 Web 服务
第 2 部分: 管理 Mashup 数据缓存
第 3 部分: 理解 RDF 和 RDFs
第 4 部分: 创建本体
第 5 部分: 切换 Web 服务
Jersey 2.x 用户指南
MyBatis中文文档
JavaScript
Google JavaScript 代码风格指南
Airbnb JavaScript 规范
JavaScript 标准参考教程(alpha)
Javascript编程指南 (源码)
javascript 的 12 个怪癖
JavaScript 秘密花园
JavaScript核心概念及实践 (PDF) (此书已由人民邮电出版社出版发行,但作者依然免费提供PDF版本,希望开发者们去购买,支持作者)
《JavaScript 模式》翻译,此书中文版有售,但是纸质书翻译的还没有这个版本翻译的好
命名函数表达式探秘 (注:原文由为之漫笔翻译,原始地址无法打开,所以此处地址为我博客上的备份)
学用 JavaScript 设计模式 (开源中国)
深入理解JavaScript系列
ECMAScript 6 入门 (作者:阮一峰)
jQuery
jQuery 解构
简单易懂的JQuery魔法
How to write jQuery plugin
Node.js
Node入门
七天学会NodeJS
Nodejs Wiki Book (繁体中文)
express.js 中文文档
koa 中文文档
使用 Express + MongoDB 搭建多人博客
Express框架
nodejs文档
Node.js 包教不包会
Learn You The Node.js For Much Win! (中文版)
Node debug 三法三例
underscore.js
Underscore.js中文文档
backbone.js
backbone.js入门教程 (PDF)
Backbone.js入门教程第二版
Developing Backbone.js Applications(中文版)
AngularJS
AngularJS最佳实践和风格指南
AngularJS中译本
AngularJS入门教程
构建自己的AngularJS
在Windows环境下用Yeoman构建AngularJS项目
zepto 简明中文手册
Sea.js
Hello Sea.js
CoffeeScript
CoffeeScript Cookbook
The Little Book on CoffeeScript中文版
ExtJS
Ext4.1.0 中文文档
Chrome扩展及应用开发
JavaScript入门教程
PHP
PHP调试技术手册(PDF)
XDebug 2中文手册(译) (CHM)
PHP之道
PHP 最佳实践
PHP安全最佳实践
深入理解PHP内核
PHP扩展开发及内核应用
CodeIgniter 用户指南
Laravel4 中文文档
Laravel 入门
Symfony2中文文档 (未译完)
Phalcon中文文档(翻译进行中)
YiiBook几本Yii框架的在线教程
简单易懂的PHP魔法
swoole文档及入门教程
iOS
iOS开发60分钟入门
iOS7人机界面指南
Google Objective-C Style Guide 中文版
iPhone 6 屏幕揭秘
Apple Watch开发初探
马上着手开发 iOS 应用程序
网易斯坦福大学公开课:iOS 7应用开发字幕文件
Android
Android Design(中文版)
Google Android官方培训课程中文版
Android学习之路
Python
小白的Python教程
简明Python教程
零基础学Python
Python 2.7 官方教程中文版
Python 3.3 官方教程中文版
深入 Python 3
PEP8 Python代码风格规范
Google Python 风格指南 中文版
Python入门教程 (PDF)
Python的神奇方法指南
笨办法学 Python (PDF版下载)
Django 文档中文版
Django 最佳实践
The Django Book 中文版
web.py 0.3 新手指南
Web.py Cookbook 简体中文版
Dive Into Python 中文版
Bottle 文档中文版 (需翻墙)
Flask 文档中文版
Jinja2 文档中文版
Werkzeug 文档中文版
Flask之旅
Introduction to Tornado 中文翻译
Python自然语言处理中文版 (感谢陈涛同学的翻译,也谢谢 ?@shwley 联系了作者)
Python 绘图库 matplotlib 官方指南中文翻译
Scrapy 0.25 文档
ThinkPython
Ruby
Ruby 风格指南
Rails 风格指南
笨方法学 Ruby
Ruby on Rails 指南
Ruby on Rails 实战圣经
Ruby on Rails Tutorial 原书第 2 版 (本书网页版免费提供,电子版以 PDF、EPub 和 Mobi 格式提供购买,仅售 9.9 美元)
编写Ruby的C拓展
Ruby 源码解读
Shell
Shell脚本编程30分钟入门
Go
Go编程基础
Go入门指南
学习Go语言 (PDF)
Go Web 编程 (此书已经出版,希望开发者们去购买,支持作者的创作)
Go实战开发 (当我收录此项目时,作者已经写完第三章,如果读完前面章节觉得有帮助,可以给作者捐赠,以鼓励作者的继续创作)
Network programming with Go 中文翻译版本
Groovy
实战 Groovy 系列
LaTeX
一份其实很短的 LaTeX 入门文档
一份不太简短的 LATEX 2ε 介绍 (PDF版)
LISP
ANSI Common Lisp 中文翻译版
Lua
Lua编程入门
Haskell
Real World Haskell 中文版
R
R语言忍者秘笈
Scala
Scala课堂 (Twitter的Scala中文教程)
Effective Scala(Twitter的Scala最佳实践的中文翻译)
Scala指南
Swift
The Swift Programming Language 中文版
Perl
Modern Perl 中文版
Perl 程序员应该知道的事
Prolog
笨办法学Prolog
Vim中文文档
Vimscript
笨方法学Vimscript 中译本
Vim中文文档
读书笔记及其它 读书笔记
编译原理(紫龙书)中文第2版习题答案
把《编程珠玑》读薄
Effective C++读书笔记
Golang 学习笔记、Python 学习笔记、C 学习笔记 (PDF)
Jsoup 学习笔记
学习笔记: Vim、Python、memcached
图灵开放书翻译计划–C++、Python、Java等
蒂姆·奥莱利随笔 (由译言网翻译,电子版免费)
Octave 入门 (PDF版)
SICP 解题集
精彩博客集合
正则表达式简明参考
JavaScript 里的闭包是什么?应用场景有哪些
看一个例子:
var foo = ( function() {
var secret = 'secret';
// “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的
return {
get_secret: function () {
// 通过定义的接口来访问 secret
return secret;
},
new_secret: function ( new_secret ) {
// 通过定义的接口来修改 secret
secret = new_secret;
}
};
} () );
foo.get_secret (); // 得到 'secret'
foo.secret; // Type error,访问不能
foo.new_secret ('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量
foo.get_secret (); // 得到 'a new secret'
引用 Douglas Crockford [1] :
之所以可能通过这种方式在 JavaScript 种实现公有,私有,特权变量正是因为闭包,闭包是指在 JavaScript 中,内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
需要注意的一点时,内部函数访问的是被创建的内部变量本身,而不是它的拷贝。所以在闭包函数内加入 loop 时要格外注意。另外当然的是,闭包特性也可以用于创建私有函数或方法。
--------
关于为什么在 JavaScript 中闭包的应用都有关键词“return”,引用 JavaScript 秘密花园中的一段话:
闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。