jquery源码知识

jq源码

1、$(function(){
//dom加载完毕方法
})
内部执行的js原生代码是DOMContentLoaded
ie兼容原理:当页面 DOM 未加载完成时,调用 doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了。

2、为什么ready先执行,load后执行?
(1) 解析HTML结构。
(2) 加载外部脚本和样式表文件。
(3) 解析并执行脚本代码。
(4) 构造HTML DOM模型。//ready
(5) 加载图片等外部文件。
(6) 页面加载完毕。//load

3、为什么要用return new jQuery.fn.init()?
https://www.cnblogs.com/SheilaSun/p/4779895.html

jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context, rootjQuery );
},
jQuery.fn = jQuery.prototype = { //fn即对应prototype
    constructor: jQuery,
    init: function( selector, context, rootjQuery ) {
        ...
        return this;
    }
    ...
}
jQuery.fn.init.prototype = jQuery.fn;

$和fn分别是jQuery和prototype的简写方式,
如果没有new,'jQuery.fn.init()'相当于调用方法, this指向的都是同一个jQuery.fn对象,$('body')和$('p')就没有区分了;
jQuery.fn.init.prototype = jQuery.fn;这句将init的原型指向jQuery的原型,所以JQ对象才可以访问‘css'、'show'、'hide'这些写在jQuery.fn上的方法;
constructor: jQuery 的作用是手动修正jQuery.prototype的指向,因为这里用了覆盖的写法

4、为何要做A.prototype.constructor=A这样的修正?
其实,不做这样的修正也不会有什么影响,它主要防止一种情况下出错,就是你显式地去使用构造函数,例如:

var woman = new Woman();
......
var woman1 = woman.constructor(); (如果修正了constructor,这句的作用就可以等价于var woman1 = new Woman();)

5、通过new操作符构建一个对象,一般经过四步:
A.创建一个新对象
B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象)
C.执行构造函数中的代码
D.返回这个新对象

6、for循环可以以如下方式写:

 	var i = 1;
	for (; i < 4; i++) {
		console.log(i);
	}

7、[].slice.call(arguments) 的作用是 将 arguments转化为真正的数组
例子:

var a={length:2,0:'first',1:'second'};
    Array.prototype.slice.call(a);//  ["first", "second"]
理解方式(Array.prototype.slice原生代码大致如下):
Array.prototype.slice = function(start,end){
     var result = new Array();
     start = start || 0;
     end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
     for(var i = start; i < end; i++){
          result.push(this[i]);
     }
     return result;
}

8、jq缓存机制:
在dom上添加一个jQuery203057332677946726140.9317828844743021:1,然后定义一个空对象cache,通过这个1和cache联系起来,存储数据,
例如:cache[1] 获取的object值就是jQuery203057332677946726140.9317828844743021值为1的dom所关联的值

9、为什么要传入 undefined

    var undefined = '6';
	(function () {
	    var a;
	    if (a === undefined) {
	        a = 'b';
	        console.log(a);
	    }
	})();

立即执行函数不传入undefined,在ie8下无法执行 console.log(a); 传入undefined可保证函数内的undefined都是undefined

10、jq怎么获取display:none元素的宽高?
偷偷设置position:absolute,visible:hidden

11、理解源码优秀博客 https://www.cnblogs.com/chaojidan/category/634197.html

12、js数组合并的两个方法:

   var a = [1,2,3];
   var b = [4,5];
   
   1、var a = a.concat(b) 
   2、[].push.apply(a,b)  
   console.log(a)  //[1,2,3,4,5]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值