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. soap的简单实现(PHP)

    1.非wsdl模式 (1)函数文件 testphp/ServiceFunctions.class.php <?php /** * @author 左小兵 * */ class ServiceFu ...

  2. android取国家,语言,存储大小等

    private static String newUUID() { return UUID.randomUUID().toString(); } private static String getLo ...

  3. Unity3d NGUI的使用(九)(UIScrollView制作滑动列表)

    UIScrollView制作滑动列表,可横向,竖直展示一些列表在固定可视范围内 UIScrollVIew只是一个可滑动的UI组件 如果需要制作复杂的可视区域UI需要配合使用UIPanel与UIGrid ...

  4. 网页上下载文件提示框(vb.net)

    Public Sub downLoadFile(ByVal fPath As String) Dim fileInfo As System.IO.FileInfo = New System.IO.Fi ...

  5. MyBatis入门学习

    所需要jar包:mybatis-3.x.x.jar .如果需要和spring整合,还需要加入相关的包 1:看项目目录 红颜色不要关心 2:按照步骤: 1:加入jar包 2:创建数据源(configur ...

  6. 在没有spineRunTime情况下手动使用spine数据

    用spine做了一些简单UI动画,结果发现游戏用的cocos2dx版本太低了,无法集成spineRunTime,无奈只好把spine记下的关键帧数据抄到一个txt文件中,然后读取txt,再自己写代码播 ...

  7. 九度OJ题目1387斐波那契数列

    /*斐波那契数列,又称黄金分割数列,指的是这样一个数列: 0.1.1.2.3.5.8.13.21.…… 在数学上,斐波纳契数列被定义如下: F0=0,F1=1, Fn=F(n-1)+F(n-2)(n& ...

  8. 【原创】VNC-view配置

    *.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...

  9. css hack 总结 包括ie6-11,chrome,opera,firefox

    <!DOCTYPE html> <html> <head> <title>Css Hack ie各版本 opera chrome safari fire ...

  10. linux网络不同的解决办法

    贯标防火墙,iptables 注释掉/etc/hosts的localhost的ipv6地址映射