What Makes Javascript Weird...and AWESOME

-> First Class Functions

-> Event-Driven Evironment

-> Closures

-> Scope

-> Context

scope === variable access

context === this

First Class functions(回调函数)

function add(first,second,callback){
console.log(first+second);
if(callback){
callback();
}
} function logDone(){
console.log('done');
} add(2,3,logDone);
add(4,5); function handleClick(){
//something smart
}
$('#myDiv').click(handleClick);

Event-Driven Evironment(事件绑定,事件驱动)

var a = 1;
console.log('up');
jQuery(document).ready(function(){
jQuery('button').on('click',function(){
alert(a);
})
})

Closures(闭包)

jQuery(document).ready(function(){
var a = 1;
jQuery('button').on('click',function(){
alert(a++);
})
})

scope(作用域)

//scope ==== variable access
//首先在自己区域找,如果没有定义,影响的就是父亲节点的
var a = 1;
function foo(){
var b = 2;
}
foo();
console.log(b);
var a = 1;

function foo(){
//定义了,自己看着办
var a = 2;
console.log(a);
} function bar(){
//没有定义,找父亲,影响父亲
a = 3;
console.log(a);
} foo();
bar();
console.log(a); //233

context(执行上下文对象)

context === this

this===window;
var a = 1;
console.log(window.a);//1
console.log(this.a);//1
console.log(window === this); function foo(){
console.log(this);
}
foo();//Window test.html var obj = {
foo : function(one, two, three){
console.log(one);
console.log(this === window);//谁调用this指向谁
}
}
obj.foo();//false //call apply bind 扩充作用域,对象不需要和方法有任何耦合
obj.foo.call(window,1,2,3);//true
obj.foo.apply(window,[1,2,3]);//true
var myBoundFoo = obj.foo.bind(window);
myBoundFoo();//true
obj.foo();//false $('#openDiv').on('click',function(){
$('#div1').sideToggle(200,function(){
$(this).toggleClass('active');
}.bind(this))
})

是什么让javascript变得如此奇妙的更多相关文章

  1. Lazy.js : 让 JavaScript 变懒

    Lazy.js : 让 JavaScript 变懒 http://segmentfault.com/a/1190000000358463

  2. Javascript变长参数和默认参数

    /* javascript 变长参数 * 实参少于形参: 剩下的参数如果没有默认值,将解析为undefined * 实参多于形参: 剩下的实参可以通过 "实参对象"-argumen ...

  3. C#webbrowser控件技巧(取得javascript变量值,禁止显示脚本错误)

    C#中的webbrowser控件比较好用. 下面本人搜索整理的几个小技巧. 1. 从C#中取得javascript的变量值. using mshtml;using System.Reflection; ...

  4. 理解JavaScript变量值

    JavaScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值是指那些可能由多个值构成的对象. 在将一个值赋给变量时,解析器必须确定这个值是基 ...

  5. 那些 JavaScript 自带的奇妙 Bug

    米娜桑,哦哈哟~ 本章讲解关于 JavaScript 奇妙的 Bug,与其说是Bug,不如说是语言本身隐藏的奥秘.接下来就看看可能会影响到我们编程的那些Bug吧. typeof null === &q ...

  6. 7个步骤:让JavaScript变得更好

    Dan Odell介绍了他编写的七步写出无瑕代码的计划,是在简化过程中最有用的工具.   随着浏览器性能提高,伴随着新的HTML5的编程接口的稳步采用,网页上的JavaScript的音量在逐渐增加.然 ...

  7. 回流与重绘:CSS性能让JavaScript变慢?

    参考张鑫旭博客: http://www.zhangxinxu.com/wordpress/2010/01/%E5%9B%9E%E6%B5%81%E4%B8%8E%E9%87%8D%E7%BB%98%E ...

  8. javascript for..in 知识

        JavaScript 中for...in...,一直在代码中使用,最初认为,for xx in obj||array 对于arry就xx对应为数组索引,对于obj来说xx对应就是obj中的pr ...

  9. 【总结】浅谈JavaScript中的接口

    一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...

随机推荐

  1. CSS3学习系列之盒样式(一)

    盒的基本类型 在css中,使用display属性来定义盒的类型,总体上来说,css中的盒分为block类型与inline类型 inline-block类型 inline-block类型是在css2.1 ...

  2. JAVA优雅停机的实现

    最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据.具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExec ...

  3. Swift组合逻辑

    我们可以组合多个逻辑运算来表达一个复合逻辑: if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverride ...

  4. PHP以星号隐藏用户名手机和邮箱

    <?php class Hidesatr{ function hide_star_do($str) { //用户名.邮箱.手机账号中间字符串以*隐藏 if (strpos($str, '@')) ...

  5. Streaming结合Kafka

    Spark2.11 两种流操作 + Kafka Spark2.x 自从引入了 Structured Streaming 后,未来数据操作将逐步转化到 DataFrame/DataSet,以下将介绍 S ...

  6. [leetcode-563-Binary Tree Tilt]

    Given a binary tree, return the tilt of the whole tree.The tilt of a tree node is defined as the abs ...

  7. Python将数据插入到数据库时遇到单引号插入错误的问题

    这才是真正的解决方法,真不知道有些人连试都没试过就乱转载 比如你要插入一个字符串,是一个变量 如:str = "I'am a handsom boy" 由于这个字符串包含',插入数 ...

  8. tkinter模块常用参数(python3)

    1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root.title('标题名')    修改框体的名字,也可在创建时使用className参数来命名:root.r ...

  9. 第二章:2.8 通过Django 在web页面上面输出 “Hello word ”

    1. 第一步:配置 guest 目录下面的 settings.py 文件, 将 sign应用添加到 guest项目中. 2. 在 guest目录下面,打开 urls.py 文件,添加 要打开的路由文件 ...

  10. P3390 【模板】矩阵快速幂

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...