1. 什么是自执行的匿名函数?
   它是指形如这样的函数: (function {// code})();
2. 疑问 为什么(function {// code})();可以被执行, 而function {// code}();却会报错?
3. 分析
(1). 首先, 要清楚两者的区别: (function {// code})是表达式, function {// code}是函数声明.
(2). 其次, js"预编译"的特点: js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
(3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符……

例如:
bootstrap 框架中的插件写法:
!function($){
  //do something;
}(jQuery);


(function($){
  //do something;
})(jQuery); 是一回事。

匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。
例如:
var a=1;
(function()(){
    var a=100;
  })();
alert(a); //弹出 1
更多 闭包和匿名函数 可查看 Javascript的匿名函数与自执行 这篇文章。

<摘自:http://www.cnblogs.com/joey0210/p/3408349.html>

举一反三:

不难发现,如下代码也是可以的:

<script>
var str = function(){
var s1 = "a";
var s2 = "b";
return s1+s2;
}();
alert(str);
</script>

执行结果:弹出"ab"。

2.  js中this指代的对象

js 中this指代的是当前的上下文对象,即离他最近的一个function对象(也就是js中的类)。

<script type = "text/javascript">
(function() { var data = {
movePage: function() {
this.arg = 1;
this.dowhat = {
method1: function() {
alert("1当前对象的arg属性值:" + this.arg);
},
method2: function() {
alert("2当前对象的arg属性值:" + this.arg);
}
};
}
}; var test = new data.movePage();
// 我们通常的调用函数的形式。alert的值为undefined
test.dowhat.method1();
// 改变this对象指代的当前上下文。
// 也就是说:这句代码会执行method1方法,并且将this指代的当前上下文指到test对象,即movePage函数。
// 而movePage函数中arg的值为1,那么alert后的值为1
test.dowhat.method1.call(test); })();
</script>

执行结果:第一次弹出:undefined  第二次弹出:1

小技巧:

  我们可以通过使用alert(xxx);来看一个对象是什么类型的。我们可以得到类似于下面的alert框
         

通过上面的描述和例子,我们就不难发现:

例1:

  1. $("#textbox").hover(
  2. function() {
  3. this.title = "Test";   // 也可以通过$(this)拿到jquery对象,然后使用$(this).attr("title", "Test");来达到目的
  4. }
  5. );

上面的例子中this对象指向的是js中原生的js对象,所以this也就是js中原生的dom对象。

例2:

jquery插件编写里总是会用到如下的代码:

(function( $ ) {
$.fn.myPlugin = function() {
// Do your awesome plugin stuff here
    return this.each(function(){.......});//主要为了能够链式调用,将jqery对象return
};
})( jQuery );
这里的this指向的是myPlugin对象,也就是jquery对象,所以它可以直接使用jquery的each方法

js封装 与 js高级用法 问题集合的更多相关文章

  1. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  2. 【转】Vue.js中 watch 的高级用法

    假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=&q ...

  3. Vue.js中 watch 的高级用法

    假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=&q ...

  4. js中“||”和“&&”的高级用法

    例1:用于赋值&&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦)|| : 从左往右依次判断,当当前值为false则继续,为tru ...

  5. 原生JS封装 toast 弹层,自动关闭

    由于公司业务需求,要一个公共toast ,下面是自己封装的一个. css: .toast { text-align: center; min-height: 70px; width: 220px; c ...

  6. JS封装动画框架,网易轮播图,旋转轮播图

    JS封装动画框架,网易轮播图,旋转轮播图 1. JS封装运动框架 // 多个属性运动框架 添加回调函数 function animate(obj,json,fn) { clearInterval(ob ...

  7. JsQuick--个人封装的Js库

    JsQuick 该库为本人封装的Js库,尚未进行浏览器兼容 /** * 快速框架 版本:1.0.0 * 日期:2015.02.26 * 作者:简楚恩 */ /** * 快速获取控件类 */ var $ ...

  8. 【JavaScript框架封装】使用原生js封装的类似于JQuery的框架及核心源码分享(多文件版本)

    这个版本的JQuery是对上一个版本的JQuery,使用了require.js进行了二次封装,基本上把前面的每一个框架封装成为一个单独的模块,最终的目录结构如下: 由于代码量和目录比较多,这个封装好的 ...

  9. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

随机推荐

  1. pdo的工作方式与查错

    pdo某些方法如prepare()会返回PDOStatement对象; 然后需要通过返回的PDOStatement对象的方法操作 当查错通过$pdo->errInfo()方法可能查不出错误信息 ...

  2. 用js实现导航菜单点击切换选中时高亮状态

    随着用户点击导航或菜单上不同的页面,出现此选项高亮显示或变为一个新的样式是经常用到的.实现它所用的原理就是通过js中的location.href得到当前页面的地址,然后在与导航上的链接地址匹对,相同的 ...

  3. java_stack

    栈是一种数据结构,它代表只能在某一端进行插入.删除操作的特殊线性表. 栈的最大特点是是后进先出(First In Last Out),对栈的操作主要是入栈和出栈,判断栈是否为空,计算栈的大小. 对栈而 ...

  4. Nginx反向代理讲解和配置

    首先来介绍下Nginx的反向代理.代理服务器一般分为正向代理(通常直接称为代理服务器)和反向代理. 画个图我们就好理解了. 正向代理:可以想象成是路由器,我们要通过它来上网的那种.(可以说是客户端的代 ...

  5. Oracle数据库—— PL/SQL进阶编程

    一.涉及内容 1.掌握PL/SQL程序块的结构 2.理解并熟练掌握各种变量的应用. 二.具体操作 1.创建一个表messages,该表只有一个字段results 类型是number(2),编写一个块, ...

  6. unity shader random number

    http://gamedev.stackexchange.com/questions/32681/random-number-hlsl

  7. Externalizable接口 序列化

    Java默认的序列化机制非常简单,而且序列化后的对象不需要再次调用构造器重新生成,但是在实际中,我们可以会希望对象的某一部分不需要被序列化,或者说一个对象被还原之后, 其内部的某些子对象需要重新创建, ...

  8. 服务器安全狗,支持Linux/windows

    安全狗: www.safedog.cn 防DDOS  sql注入检测

  9. 【性能诊断】六、并发场景的性能分析(windbg案例,大量的内部异常造成CPU飙升)

    在做产品的某个核心模块的性能优化时,发现压到100并发时应用服务器的CPU就飙升至90%以上,50并发以后TPS就基本定格在一个数值上.使用性能监视器收集应用服务器的数据,发现每秒的.NET CLR ...

  10. ASP.NET MVC3升级到ASP.NET MVC4 的方法

    ASP.NET MVC3升级 ASP.NET MVC4 的方法: 1.先去掉引用的System.Web.Mvc.dll(MVC3版本),重新引入System.Web.Mvc.dll(MVC4版本) 2 ...