(function(){})() 立即执行函数 $(function (){}) DOM加载后


Js方法:

复制代码
<script type=”text/javascript”>

window.onload=function (){

    var userName=”xiaoming”;

    alert(userName);

}
</script>
复制代码

jQuery方法,需要引用jQuery文件:

复制代码
<script type=”text/javascript”>

$(document).ready(function (){

    var userName=”xiaoming”;

    alert(userName);

});
</script>
复制代码

或者其简写:

复制代码
$(function (){

var userName=”xiaoming”;

alert(userName);

});
复制代码

在DOM加载完就可以执行(比window.onload更早)。在同一页面中可以多次出现.ready()

两者主要区别:Window.onload=function (){}:

当一个文档完全下载到浏览器中时,才会触发window.onload事件。这意味着页面上的全部元素对js而言都是可以操作的,也就是说页面上的所有元素加载完毕才会执行。这种情况对编写功能性代码非常有利,因为无需考虑加载的次序。

 

$(document).ready(function (){});

会在DOM完全就绪并可以使用时调用。虽然这也意味着所有元素对脚本而言是可以访问的,但是,并不意味着所有关联的文件都已经下载完毕。换句话说,当HTML下载完成并解析为DOM树之后,代码就会执行。

 

使用$(document).ready(function (){})一般来说都要优于使用onload事件处理程序,但必须要明确一点,因为支持文件可能还没有加载完成,所以类似图像的高度和宽度这样的属性此时不一定有效。

 

注:用把js放在页面底部的方法以及运用defer=”defer”的方法都是会出现问题的。最好使用$(document).ready(function (){})函数。

 

 

 

理解javascript中的立即执行函数(function(){})()

 

之前看了好多代码,都有用到这种函数的写法,但是都没认真的去想为什么会这样写,今天开始想学习下jquery的源码,发现jquery也是使用这种方式,用(function(window, undefined){})(window)包裹内部代码,于是进一步的去学习了下。

要理解立即执行函数(function(){})(),先了解些函数的基本概念(函数声明、函数表达式、匿名函数)。

函数声明:使用function声明函数,并指定函数名。 

function setFn() {
    // coding   
}

函数表达式:使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。

var setFn = function() {
    // coding
}

匿名函数:使用function关键字声明函数,但未指定函数名。匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

function() {
    // coding
}

函数声明与函数表达式的不同在于:

1. 函数声明可在当前作用域下提前调用执行,函数表达式需等执行到该函数后,方可执行,不可提前调用。

复制代码
setFn()
function setFn() {
    // coding  
}
// 正常,函数声明可提前调用

setFn()
var setFn = function() {
    // coding
} 
// 报错,setFn未保存对函数的引用,函数调用需放在函数表达式后面
复制代码

2. 函数表达式可直接在函数后加括号调用。

var setFn = function() {
    console.log(2)
}()

// 2   解析至此,可直接执行调用

立即执行函数(function(){})()可以看出很像函数表达式的调用,但为什么要加括号呢?如果不加括号:

复制代码
function(){
    console.log(1)
}()

// 报错,函数需要函数名

解析: 虽然匿名函数属于函数表达式,但未进行赋值,所以javascript解析时将开头的function当做函数声明,故报错提示需要函数名
复制代码

立即执行函数里面的函数必须是函数表达式,所以由var setFn = function() {}()可以理解为在匿名函数前加了 = 运算符后,将函数声明转化为函数表达式,所以拿!,+,-,()...等运算符来测试下是否如此。

复制代码
!function(){
    console.log(1)
}()
// 1
    
+function(){
    console.log(2)
}()
// 2
    
-function(){
    console.log(3)
}()
// 3
    
(function(){
    console.log(4)
})()
// 4
复制代码

 

由此可见,加运算符确实可将函数声明转化为函数表达式,而之所以使用括号,是因为括号相对其他运算符会更安全,可以减少不必要的麻烦。

立即执行函数与正常函数传参形式是一致的。

(function(a, b){
    console.log(a + b);
})(1, 2)
// 3

(function(){}())这样写的好处是在内部定义的变量不会跟外部的变量有冲突,达到保护内部变量的作用。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM