offer收割攻略,Web前端面试真题jQuery系列(带详解)(2)

本文详细解析了jQuery的封装策略,自执行函数防止变量污染,闭包绑定全局变量,原型和链式调用的优化,以及函数作用域、队列管理、事件绑定和自定义事件的使用。还介绍了Sizzle选择器的结合和RESTful架构在Node.js中的应用。
摘要由CSDN通过智能技术生成
  1. jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链

(function( window, undefined ) {

//用一个函数域包起来,就是所谓的沙箱

//在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局

//把当前沙箱需要的外部变量通过函数参数引入进来

//只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数

window.jQuery = window.$ = jQuery;

})( window );

  1. jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
3.有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度  
4.jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率

2 jQuery 的实现原理

1.(function(window, undefined) {})(window);

jQuery 利用 JS 函数作用域的特性,采用立即调用表达式包裹了自身,解决命名空间和变量污染问题

2.window.jQuery = window.$ = jQuery;

在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量

3 jQuery.fn 的 init 方法返回的 this 指的是什么对象

1.jQuery.fn 的 init 方法 返回的 this 就是 jQuery 对象

2.用户使用 jQuery() 或 $() 即可初始化 jQuery 对象,不需要动态的去调用 init 方法

4 jQuery.extend 与 jQuery.fn.extend 的区别

$.fn.extend() 和 $.extend() 是 jQuery 为扩展插件提拱了两个方法

$.extend(object) ; // 为jQuery添加“静态方法”(工具方法)

$.extend({

min: function(a, b) { return a < b ? a : b; },

max: function(a, b) { return a > b ? a : b; }

});

$.min(2,3); // 2

$.max(4,5); // 5

$.extend([true,] targetObject, object1[, object2]); // 对targt对象进行扩展

var settings = {validate:false, limit:5};

var options ={validate:true, name:“bar”};

$.extend(settings, options); //注意:不支持第一个参数传 false

// settings == {validate:true, limit:5, name:“bar”}

$.fn.extend(json) ; // 为jQuery添加“成员函数”(实例方法)

$.fn.extend({

alertValue: function() {

$(this).click(function(){

alert($(this).val());

});

}

});

$(“#email”).alertValue();

5 jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝

1.浅拷贝(只复制一份原始对象的引用)

var newObject = $.extend({}, oldObject);

2.深拷贝(对原始对象属性所引用的对象进行递归拷贝

var newObject =$.extend(true, {}, oldObject);

6 jQuery 的队列是如何实现的

1.jQuery 核心中有⼀组队列控制方法,由 queue()/dequeue()/clearQueue() 三个方法组成。

2.主要应用于 animate() , ajax ,其他要按时间顺序执行的事件中

var func1 = function(){alert(‘事件1’);}

var func2 = function(){alert(‘事件2’);}

var func3 = function(){alert(‘事件3’);}

var func4 = function(){alert(‘事件4’);}

// 入栈队列事件

$(‘#box’).queue(“queue1”, func1); // push func1 to queue1

$(‘#box’).queue(“queue1”, func2); // push func2 to queue1

// 替换队列事件

$(‘#box’).queue(“queue1”, []); // delete queue1 with empty array

$(‘#box’).queue(“queue1”, [func3, func4]); // replace queue1

// 获取队列事件(返回一个函数数组)

$(‘#box’).queue(“queue1”); // [func3(), func4()]

// 出栈队列事件并执行

$(‘#box’).dequeue(“queue1”); // return func3 and do func3

$(‘#box’).dequeue(“queue1”); // return func4 and do func4

// 清空整个队列

$(‘#box’).clearQueue(“queue1”); // delete queue1 with clearQueue

7 jQuery 中的 bind(), live(), delegate(), on()的区别

1.bind() 直接绑定在目标元素上

2.live() 通过冒泡传播事件,默认 document 上,支持动态数据

3.delegate() 更精确的小范围使用事件代理,性能优于 live

4.on() 是最新的 1.9 版本整合了之前的三种方式的新事件绑定机制

8 是否知道自定义事件

  • 事件即“发布/订阅”模式,自定义事件即“消息发布”,事件的监听即“订阅订阅”

  • JS 原生支持自定义事件,示例:

document.createEvent(type); // 创建事件

event.initEvent(eventType, canBubble, prevent); // 初始化事件

target.addEventListener(‘dataavailable’, handler, false); // 监听事件

target.dispatchEvent(e); // 触发事件

  • jQuery 里的 fire 函数用于调用 jQuery 自定义事件列表中的事件

9 jQuery 通过哪个方法和 Sizzle 选择器结合的

最后

全网独播-价值千万金融项目前端架构实战

从两道网易面试题-分析JavaScript底层机制

RESTful架构在Nodejs下的最佳实践

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一线互联网企业如何初始化项目-做一个自己的vue-cli

思维无价,看我用Nodejs实现MVC

代码优雅的秘诀-用观察者模式深度解耦模块

前端高级实战,如何封装属于自己的JS库

VUE组件库级组件封装-高复用弹窗组件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值