`
deng131
  • 浏览: 673521 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

闭包传入参数 window & undefined

阅读更多
大家在前端开发中对闭包应该和熟悉了,也就是几种常见的闭包方式:

1:
var fn = function(i){
      var j = i;
      return function(){ 
            return j;
      }
}


2:
(function(undefined){
     //do something
})


...

今天主要说的是2这样闭包方法中传参数问题,在各种前端js框架中经常也会见到这样代码,如果不仔细分析真的很难想到这样使用的用意。
(function(undefined){
     //do something
})() //1

在闭包行参使用undefined而不是从外部1处传入参数,这样做是考虑到在undefined在外部被赋值情况,那么这时候在闭包内部使用undefined就会出现问题了,那么就需要
if(typeof undefined === 'undefined') {
// 
} 
判断。在外部不传参数情况下,闭包内部使用形参在没有赋值时undefined将会保持原本含义,这是由JavaScript 作用域规则决定。
为了不让内部的undefined不会被污染,在形参中默认加上undefined,所以在jquery等js库源代码会看到
(function(window,undefined){
   //todo something
})()

这样代码。在形参中传入默认window也是;类似一样的原理。

最后可以测试下:
var undefined = 123;
(function(undefined){
  console.info(undefined);
})() //在参数中传入undefined和不传情况下会输出什么?


参考:
http://www.iamued.com/qianduan/1450.html


1
5
分享到:
评论
1 楼 deng131 2012-10-29  
在zepto.js代码中也有同样的处理方式:
var undefined, key, $$, classList, emptyArray = [], slice = emptyArray.slice,
 document = window.document,


http://stackoverflow.com/questions/2534260/var-undefined-true

相关推荐

    Jqurey 源码分析

    在这里,`undefined`被作为参数传入,主要是为了确保在函数内部,`undefined`始终是真正未定义的状态,因为`undefined`在全局作用域中可以被重新赋值。这是为了防止外部代码对`undefined`的修改影响到jQuery内部的...

    JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】

    默认情况下,如果在非严格模式下,`this`指向全局对象(在浏览器中通常是`window`),在严格模式下,`this`为`undefined`。 - **call/apply/bind方法**:这三个方法可以用来改变函数执行时的上下文(`this`值)和...

    JavaScript闭包和范围实例详解

    5. `arguments`对象是每个函数内部的一个特殊对象,它包含了函数调用时传入的所有参数。在这个例子中,即使参数`a`没有被显式赋值,`arguments[2]`的修改也会影响到实参`a`的值。 6. `this`关键字在JavaScript中...

    js bind 函数 使用闭包保存执行上下文

    `bind`方法接受一个对象作为参数,并返回一个新的函数,当这个新函数被调用时,`this`会被设置为传入的参数对象。以下是`bind`的一个简单实现: ```javascript Function.prototype.bind = function(obj) { var _...

    详细讲解JavaScript中的this绑定

    - `Function.prototype.bind`则创建了一个新函数,这个新函数的`this`值被固定为传入`bind`的参数,无论何时何地调用新函数,`this`始终不变。 4. **new 绑定**: - 当使用`new`关键字创建对象实例时,`this`会被...

    javascript 函数及作用域总结介绍

    如果传入的参数少于定义的参数,未定义的参数默认为undefined。 此外,JavaScript还有闭包的概念,这是一个非常重要的特性。闭包允许函数访问并操作函数外部的变量,即使外部函数已经返回。闭包的实现依赖于...

    javascript中有趣的反柯里化深入分析

    因此,如果我们将一个函数的this上下文置为null或undefined,再通过apply方法调用,那么该函数的this就不再指向原来的对象,而是指向了全局对象(在浏览器中通常是window),或者是在严格模式下指向undefined。...

    Javascript-functions-implementation:Javascript函数实现

    如果实参数量少于形参,未传入的形参将默认为`undefined`。 3. 函数作用域 JavaScript有两种作用域:全局作用域和局部作用域。在函数内部定义的变量具有局部作用域,只在函数内部可访问;而在函数外部定义的变量是...

    常用面试题及答案.pdf

    - **Array.map()** 也是用于遍历数组中的每个元素,但与 `.forEach()` 不同的是,`.map()` 返回一个新的数组,其中包含原始数组元素经由传入的函数处理后的结果。 选择使用 `.forEach()` 还是 `.map()` 主要取决于...

    详解JavaScript函数

    默认情况下,它指向全局对象(在浏览器环境中是`window`),但在严格模式下,如果没有明确的上下文,`this`将是`undefined`。可以通过`call`、`apply`或`bind`方法改变`this`的指向。 ### 四、函数作用域 ...

    JavaScript程序设计javascript中的thi

    `bind`则返回一个新的函数,其`this`值被固定为传入的参数。 6. **箭头函数绑定**:箭头函数没有自己的`this`,它会捕获其所在(即定义时)的作用域的`this`值。这是一个与常规函数不同的行为,需特别注意。 在...

    js中this对象用法分析

    `call`直接传入参数,而`apply`则以数组形式传入参数。例如: ```javascript var d = { getThis: function() { console.log(this); } }; var e = { name: 'e' }; d.getThis.call(e); // 输出 e ``` 虽然...

    前端Javascript相关面试基础问答整理md

    - **`apply`**:立即调用函数并传入参数数组。 - **`bind`**:返回一个新的绑定函数。 #### 6. `new` 的原理 - 创建一个空对象。 - 将空对象的原型指向构造函数的原型。 - 将构造函数的作用域赋给新对象。 - 执行...

    (function(){})()的用法与优点

    例如,`(function(window, document, undefined) {...})(window, document)` 这样的写法可以确保 `undefined` 在函数内部始终为未定义,防止被意外覆盖。 5. **闭包**:IIFE 也经常与闭包结合使用,允许函数访问并...

    JQuery中SetTimeOut传参问题探讨

    描述中提到,无论是在`window.setTimeout`还是`window.setInterval`中,如果直接在函数名后加括号并附带参数,那么这个函数会立即执行,而不是按预期进行延时或周期执行。这个知识点是理解和使用`setTimeout`和`...

    JS立即执行函数功能与用法分析

    2. **传入参数**:IIFE可以接受外部传入的参数,从而可以在函数内部使用这些参数。 3. **使用运算符**:在函数前使用运算符`!`、`+`、`-`等,这些运算符能够将函数声明转换为函数表达式,然后函数表达式可以通过在...

    浅析Javascript中bind()方法的使用与实现

    bind()方法是JavaScript中Function对象的一个原生方法,它用于创建一个新的函数,这个新函数的this值被指定为bind()的第一个参数,而其余参数将作为新函数的预设参数传入。它主要解决的是this指向的问题。 ### bind...

    javascript Function函数理解与实战

    - `arguments`:这是一个类数组对象,包含了函数调用时传入的所有参数,即使没有在函数声明中定义这些参数。 - `this`:在函数执行时,`this`指向当前执行上下文的对象。在全局环境中,`this`通常指向`window`对象,...

    深入浅析JavaScript中的Function类型

    - **arguments对象**:在函数内部,arguments对象存储了所有传入函数的参数,即使这些参数未在函数声明中定义。它还有一个callee属性,可以用来引用当前函数自身。 - **this关键字**:this根据函数调用的方式指向...

Global site tag (gtag.js) - Google Analytics