大家在前端开发中对闭包应该和熟悉了,也就是几种常见的闭包方式:
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
分享到:
相关推荐
在这里,`undefined`被作为参数传入,主要是为了确保在函数内部,`undefined`始终是真正未定义的状态,因为`undefined`在全局作用域中可以被重新赋值。这是为了防止外部代码对`undefined`的修改影响到jQuery内部的...
默认情况下,如果在非严格模式下,`this`指向全局对象(在浏览器中通常是`window`),在严格模式下,`this`为`undefined`。 - **call/apply/bind方法**:这三个方法可以用来改变函数执行时的上下文(`this`值)和...
5. `arguments`对象是每个函数内部的一个特殊对象,它包含了函数调用时传入的所有参数。在这个例子中,即使参数`a`没有被显式赋值,`arguments[2]`的修改也会影响到实参`a`的值。 6. `this`关键字在JavaScript中...
`bind`方法接受一个对象作为参数,并返回一个新的函数,当这个新函数被调用时,`this`会被设置为传入的参数对象。以下是`bind`的一个简单实现: ```javascript Function.prototype.bind = function(obj) { var _...
- `Function.prototype.bind`则创建了一个新函数,这个新函数的`this`值被固定为传入`bind`的参数,无论何时何地调用新函数,`this`始终不变。 4. **new 绑定**: - 当使用`new`关键字创建对象实例时,`this`会被...
如果传入的参数少于定义的参数,未定义的参数默认为undefined。 此外,JavaScript还有闭包的概念,这是一个非常重要的特性。闭包允许函数访问并操作函数外部的变量,即使外部函数已经返回。闭包的实现依赖于...
因此,如果我们将一个函数的this上下文置为null或undefined,再通过apply方法调用,那么该函数的this就不再指向原来的对象,而是指向了全局对象(在浏览器中通常是window),或者是在严格模式下指向undefined。...
如果实参数量少于形参,未传入的形参将默认为`undefined`。 3. 函数作用域 JavaScript有两种作用域:全局作用域和局部作用域。在函数内部定义的变量具有局部作用域,只在函数内部可访问;而在函数外部定义的变量是...
- **Array.map()** 也是用于遍历数组中的每个元素,但与 `.forEach()` 不同的是,`.map()` 返回一个新的数组,其中包含原始数组元素经由传入的函数处理后的结果。 选择使用 `.forEach()` 还是 `.map()` 主要取决于...
默认情况下,它指向全局对象(在浏览器环境中是`window`),但在严格模式下,如果没有明确的上下文,`this`将是`undefined`。可以通过`call`、`apply`或`bind`方法改变`this`的指向。 ### 四、函数作用域 ...
`bind`则返回一个新的函数,其`this`值被固定为传入的参数。 6. **箭头函数绑定**:箭头函数没有自己的`this`,它会捕获其所在(即定义时)的作用域的`this`值。这是一个与常规函数不同的行为,需特别注意。 在...
`call`直接传入参数,而`apply`则以数组形式传入参数。例如: ```javascript var d = { getThis: function() { console.log(this); } }; var e = { name: 'e' }; d.getThis.call(e); // 输出 e ``` 虽然...
- **`apply`**:立即调用函数并传入参数数组。 - **`bind`**:返回一个新的绑定函数。 #### 6. `new` 的原理 - 创建一个空对象。 - 将空对象的原型指向构造函数的原型。 - 将构造函数的作用域赋给新对象。 - 执行...
例如,`(function(window, document, undefined) {...})(window, document)` 这样的写法可以确保 `undefined` 在函数内部始终为未定义,防止被意外覆盖。 5. **闭包**:IIFE 也经常与闭包结合使用,允许函数访问并...
描述中提到,无论是在`window.setTimeout`还是`window.setInterval`中,如果直接在函数名后加括号并附带参数,那么这个函数会立即执行,而不是按预期进行延时或周期执行。这个知识点是理解和使用`setTimeout`和`...
2. **传入参数**:IIFE可以接受外部传入的参数,从而可以在函数内部使用这些参数。 3. **使用运算符**:在函数前使用运算符`!`、`+`、`-`等,这些运算符能够将函数声明转换为函数表达式,然后函数表达式可以通过在...
bind()方法是JavaScript中Function对象的一个原生方法,它用于创建一个新的函数,这个新函数的this值被指定为bind()的第一个参数,而其余参数将作为新函数的预设参数传入。它主要解决的是this指向的问题。 ### bind...
- `arguments`:这是一个类数组对象,包含了函数调用时传入的所有参数,即使没有在函数声明中定义这些参数。 - `this`:在函数执行时,`this`指向当前执行上下文的对象。在全局环境中,`this`通常指向`window`对象,...
- **arguments对象**:在函数内部,arguments对象存储了所有传入函数的参数,即使这些参数未在函数声明中定义。它还有一个callee属性,可以用来引用当前函数自身。 - **this关键字**:this根据函数调用的方式指向...