引子 长久以来一直都没有专门学过 JS ,因为之前有自己啃过 C++ ,又打过一段时间的算法竞赛(写得一手好意大利面条),于是自己折腾自己的网站的时候,一直都把 JS 当 C 写.但写的时候总会遇到一些奇怪的问题,于是打算花点时间看了看<你不知道的JavaScript>.写这篇文章以记录一下一段时间的学习内容,也治疗一下我不爱做笔记和总结的毛病.如果你也是一直按着别的语言的编程习惯来写 JS 而没有专门去了解过它,不妨一起来了解一下 JS 的一些独特之处. 首先来看一段代码: console.…
一,js动画基本都是依靠setInterval和setTimeout来实现 1,setInterval是间隔执行,过一段时间执行一次代码 setInterval(function(){},500);即每隔500毫秒执行一次function(),不主动停止,会一直做下去. 2,setTimeout是延时执行,隔一段时间以后执行 setTimeout(function(){},500);即500毫秒以后执行函数function(),执行一次就结束了. /*var a=0 var b=setInter…
function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } } return getValue(); } console.log(function functions(true)); 请问这段代码会输出什么呢. 答案将永远是:b. 解释一下为什么,因为在js是没有块级作用域的,又因为函数声明提升的原因,上面的这段代码变…
问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ var name='killua' //把name定义在块里和放在外面是一样的,等同于在外面声明一个变量name,在块内给name赋值 }//同等于下面的代码 //建议用下面方式写 var name if(true){ name='killua' } console.log(name) //打印出来…
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve…
1.对变量提升的理解 1.变量定义(上下文) 2.函数声明 2.说明 this 几种不同的使用场景 常见用法 1.作为构造函数执行 2.作为对象属性执行 3.作为普通函数执行(this === window) 4.call apply bind 3.创建10个 <a>标签,点击的时候弹出来对应的序号 结果:均显示 这种的结果是:每次点击时 i 都为10:点击 click 时,弹出 i,i 是自由变量,这时 i 已经变为 10了,故每次输出都为10:i 是全局作用域,存在覆盖的问题 使用 i 将…
 原文:你不知道的js系列 A 动态作用域 动态作用域 是和 JavaScript中的词法作用域 对立的概念. 动态作用域和 JavaScript 中的另外一个机制 (this)很相似. 词法作用域是在代码编写时就定义好了的(假设没有使用 eval() 或者 with 欺骗词法作用域) 动态作用域也就意味着在运行时才能动态确定. function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2;…
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏变量或函数的需求, 这就是块级作用域的由来. 下面是不用es6实现块级作用域的三种方法, 供以后开发时参考, 相信对其他人也有用. IIFE IIFE, 即立即执行函数, 用一个函数作用域(闭包)来模拟块级作用域.示例如下: //es6中的块级作用域 {let a = 1; console.log(…
在讲解主要内容之前,我们先来看看JS的解析顺序,我们惯性地觉得JS是从上往下执行的,所以我们要用一个变量来首先声明它,来看下面这段代码: alert(a); var a = 1; 大家觉得这段代码有什么问题吗?会报错吧,a变量没有声明就调用?或者,可能弹出数字1? 实际上,你会发现这段代码执行的结果是弹出一个“undefined”,为什么会这样呢?下面我们就来讲讲JS的解析顺序. 1.JS的解析顺序 其实说JS是自上而下解析是正确的,但是是分为两步: 先自上而下解析声明,包括用var.funct…
js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.log(x); } foo();// 2 结果为2,可见js中并没有块级作用域的概念 能够使用以下的方法创造自己的作用域.这样不会干扰到外部变量 function foo() { var x = 1; if (x) { (function() { var x = 2; }()); } console.…