jquery 为什么要这么写

jqery 生成对象写法,我们调用jquery $(“div”)然后调用对应的函数或者属性我们就能快乐写代码了,通过他历史版本发现他们思路。

历史版本

var jQuery = function(a,c) {
	// If the context is global, return a new object
	if ( window == this )
		return new jQuery(a,c);

	// Make sure that a selection was provided
	a = a || document;
	
	// HANDLE: $(function)
	// Shortcut for document ready
	if ( jQuery.isFunction(a) )
		return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
	
	// Handle HTML strings
	if ( typeof a  == "string" ) {
		// HANDLE: $(html) -> $(array)
		var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
		if ( m )
			a = jQuery.clean( [ m[1] ] );
		
		// HANDLE: $(expr)
		else
			return new jQuery( c ).find( a );
	}
	
	return this.setArray(
		// HANDLE: $(array)
		a.constructor == Array && a ||

		// HANDLE: $(arraylike)
		// Watch for when an array-like object is passed as the selector
		(a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||

		// HANDLE: $(*)
		[ a ] );
};

1.1.3以下版本(包括),没有采用闭包,但还是用的匿名函数异常内部实现,这个里面直接写选择逻辑,这种是我们常见写法,这个时候他们还没有单独把选择器代码用init的函数单独封装起来。这里含有new的和选择代码,不同代码逻辑放在一个函数里面,这样子就比较混乱,还是后面代码清晰很多。

1.1.4版本

var jQuery = function(a,c) {
	// If the context is global, return a new object
	if ( window == this || !this.init )
		return new jQuery(a,c);
	
	return this.init(a,c);
};

jquery 为了用户 无论new不new都是返回jquery对象,后面高版本全部都直接new,这样子代码简答一点,同时进行代码隔离,Jquery 函数对象 与 new Jquery对象分开, 因为它的调用

new JQuery.fn.init();

new其实 init 对象,与jquery 没有关系, 为了使用jquery 原始链的方法,又把init 原始链替换成Jquery的原型链

开始init 只是作为入口函数而已,代码清晰好多。

return new jQuery( c ).find( a );

老代码查找用重新new 而已,后面用原型链感觉只是代码更加清晰,别的书籍说了为了隔离,我感觉不是很靠谱,基本上都是为了返回jquery对象而已。

jquery 历史老版本地址

Google Code Archive – Long-term storage for Google Code Project Hosting.

这个google地址,所以需要梯子

补充

直接复制自己笔记,后面可能会补充修改

今天用Java写网络代码,好久没有这么写代码,一气呵成写逻辑代码,感觉就没有停下来过。。写着突然明白以前不是很懂的东西,现在看来真简单。

javascript this 探索

一,背景

自己是以C入门的,然后c++,然后c#,然后java,然后python 然后node js,然后其他。。。对javascript this 理解与以前其他语言有出入,导致使用的时候会遇到this指向问题,我估计对于新手应该都会遇到这个问题。

二,坑

javascript中 funtion是对象,这句话我相信很多新手都会听到,那么自然认为在function 中的this就是指向本身,因为这句话本身是错误,那么我们用this怎么可能是对呢。反正我被同事错误说法误导很多次了。。。

三,代码

<!DOCTYPE html>
<html>
    <script>
        function foo(){
            console.log(this.a)
        }

        var a = "我在windows作用域里面"
        var obj = {
            a:"我在obj的作用域",
            foo: foo
        }

        foo()   //全局作用域 
        obj.foo()   //obj作用域
        var temp_function = obj.foo
        temp_function() //全局,跟调用的时候绑定

        
    </script>
</html>

四,说明

this 是在调用时候绑定,跟敲代码作用域没有关系,而跟调用作用域有关系。

五,书籍

<你不知道的javascript>,看他的第二部分this内容写的这边博客,自己总结一下。


六,补充

可以看mdn 官网权威文档介绍,js 万物皆对象,函数的this是动态绑定,这个跟我们其他高级语言不一样,编译的器已经确定this指向了

this – JavaScript | MDN (mozilla.org)