`

javascript 闭包 和 函数异步执行的举例

阅读更多
<style type="text/css">
#a1{
background:url(img/Alaphabet-d.jpg);
  background-repeat:no-repeat;
background-position:0px -0px;
height:210px;
width:210px;
}   

这个css 显示一副大图(字母表)的一部分(每个字母)

用 javascript 控制显示

有两种写法

第一种写法,是我的写法,传参进入 setInterval 中,直接返回一个带参数的函数

function change1(x_i){
if(document.styleSheets[0].cssRules){
document.styleSheets[0].cssRules[0].style["background-position"]="-0px -"+String(215*x_i)+"px";
}
}
function load(){
var i=0;
setInterval(function(){i++;j++; if(i==5) i=0;if(j==5) j=0; change(i,j);},2000);


第二种写法,很有意思

javascript 是异步执行,把所有函数都扔到一个堆栈里,顺序执行

function change1(x_i){
if(document.styleSheets[0].cssRules){
document.styleSheets[0].cssRules[0].style["background-position"]="-0px -"+String(215*x_i)+"px";
}
}
function load(){
var i=0; j=2;
for(i=0;i<50;i++){
    ( function(){var j=i;setTimeout(function(){change1(j%5);},1000*j); }  )();
}

}


这个红色字体为什么不能写成下面呢?
      var j=i;
    setInterval(function(){change1(j%5);},2000);

因为不用闭包包起来,就不能形成自己的作用域,j 值就是变化的

为什么不能写成下面这样呢?
(function(){var j=i;setTimeout(function(){change1(i%5);},1000*j); }  )();

首先用 function(){ }() 括起来,就形成了一个自己的域
用j=i ,在此域内获得i 值, 堆栈中的值是存入每次变化的参数

如果直接传参数为i

程序会首先执行完循环, 把函数扔到堆栈中,然后拿出来执行,当执行的时候,i 已经循环结束,为循环最后一个值, 这时候所有的函数参数都一样的
分享到:
评论

相关推荐

    理解javascript函数式编程中的闭包(closure)

    ”这个定义对于大家来说有些晦涩难懂,所以让我们先通过例子和不那么严格的解释来说明什么是闭包,然后再举例说明一些闭包的经典用途。 什么是闭包 通俗地讲, JavaScript 中每个的函数都是一个闭包,但通常意义上...

    JavaScript中的函数(二)

    JavaScript中的函数是编程中的基本构件,它不仅包含了代码块,而且可以通过事件或直接调用来执行。在JavaScript中,函数可以实现代码的封装和重用,它们可以作为对象使用,还可以被赋值给变量。JavaScript是一种区分...

    javascript - ajax ppt

    在这个例子中,`step`函数是`fade`函数内部的,它能够访问并修改`fade`函数的作用域内的`dom`和`level`变量,即使在`fade`函数执行完毕后,`step`仍然可以通过闭包保持对这些变量的引用,实现了颜色的逐渐变化。...

    JavaScript进阶(三)闭包原理与用法详解

    在JavaScript中,闭包是一种强大的特性,它允许函数访问并操作其外部作用域中的变量,即使在函数执行完毕后这些变量仍然存在。闭包的概念源于函数的“封闭”特性,即函数可以访问其自身作用域以及所有父级作用域的...

    If Hemingway Wrote JavaScript.pdf

    JavaScript提供了很多内置的对象和函数,为实现功能提供了多样的选择,从基本的字符串和数组操作,到复杂的事件处理和异步编程。 在编程中,了解各种不同方法的适用场景是至关重要的。举例来说,事件监听可以是通过...

    前端JS基础知识点及常考面试题汇总

    异步编程是JavaScript的重要特性,主要通过回调函数、Promise和async/await来实现。这些机制避免了阻塞主线程,提高了应用的响应性。 **AJAX与Fetch API** AJAX(异步JavaScript和XML)允许不刷新整个页面的情况下...

    javascript

    9. **函数**:深入探讨函数的作用域、闭包、高阶函数等高级概念。 10. **函数的认识**:进一步理解函数的内部机制,如参数传递、函数作为对象等特性。 11. **函数表达式**:讲解函数表达式的定义与用法。 12. ...

    深入理解JavaScript 中的执行上下文和执行栈

    JavaScript 是一种动态...理解执行上下文和执行栈对于解决 JavaScript 中的变量作用域、闭包、异步处理等问题至关重要。熟练掌握这些概念将有助于编写更高效、可维护的代码,提升作为 JavaScript 开发者的专业素养。

    深入解析JavaScript中函数的Currying柯里化

    柯里化在JavaScript中的实现方式通常涉及到闭包和高阶函数。闭包可以让我们保存函数的状态,而高阶函数允许函数接收其他函数作为参数或返回其他函数。在给出的示例中,`sum`函数通过递归的方式实现了柯里化。`sum`...

    JavaScript.The.Good.Parts阅读笔记(二)作用域闭包减缓全局空间污染

    在JavaScript编程中,作用域和闭包是两个非常重要的概念,它们对于理解代码的执行流程以及如何有效地管理变量至关重要。本文将深入探讨这两个主题,并举例说明如何使用它们来避免全局空间污染。 首先,我们来看看...

    一个汇集于前端所有知识点的面试宝典

    变量提升和函数提升是JavaScript预解析阶段的特性,它们会让变量和函数声明提前到所在作用域的顶部,但函数提升优先于变量提升。 闭包是JavaScript中的一个重要概念,它发生在内部函数引用了外部函数的变量时。闭包...

    Python函数嵌套实例

    在Python中函数可以作为参数进行传递,而也可以赋值给其他变量(类似Javascript,或者C/C++中的函数指针); 类似Javascript,Python支持函数嵌套,Javascript嵌套函数的应用模式对Python适用; 复制代码 代码如下: ...

    JavaScript学习第1季(2)

    JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在客户端脚本...在后续的学习中,还会涉及更多高级概念,如函数、对象、作用域闭包、事件处理等,逐步掌握这些,你就能更好地驾驭JavaScript这门强大的语言。

    123-基本-JavaScript-面试问题:JavaScript面试问题

    面试中,JavaScript的问题往往占据了重要的位置,因为它是构建交互式网页和应用程序的基础。以下是一些基本的JavaScript面试问题,这些问题涵盖了语言的核心概念、函数、编码挑战以及面向对象编程的相关知识点。 1....

    JavaScript 命名空间 使用介绍

    总结起来,虽然JavaScript语言本身不支持命名空间,但通过函数作用域、立即执行函数表达式、对象字面量以及闭包等技术,开发者能够有效地组织和隔离代码,模拟出类似其他编程语言中的命名空间的功能。这对于维护大型...

    jQuery AJAX回调函数this指向问题

    作者举例说明了通过修改Function原型来添加自定义的Apply方法,使得在函数执行时,可以将this的指向设置为任意的对象。这样,就可以确保在AJAX回调中,函数内的this指向我们期望的对象,从而保证了参数的正确传递和...

    浅谈javascript 面向对象编程

    从提供的内容来看,作者举例说明了闭包的应用,展示了闭包如何使得内部函数能够访问外部函数的变量。这种机制可以隐藏私有变量和方法,从而实现封装的效果。在JavaScript中,这通常通过立即执行函数表达式(IIFE)...

    ES6标准 Arrow Function(箭头函数=)

    ES6中的箭头函数是JavaScript语言的一次重大更新,它为编写函数提供了更为简洁和清晰的语法。箭头函数的引入主要解决了传统函数定义中的一些问题,如易错的拼写和冗余的代码。 首先,传统JavaScript函数的定义方式...

    在JavaScript中使用timer示例

    在JavaScript编程中,timers(计时器)是一种常用的机制,它允许你指定一个代码段,在未来某个特定的时间间隔之后执行。JavaScript提供了两种主要类型的timers:`setTimeout`和`setInterval`。`setTimeout`用于在...

Global site tag (gtag.js) - Google Analytics