Understanding Bind in JavaScript

01-12-2014

你(son)和你爸(papa)在一块的时候,大家都会知道你爸爸的名字(不知道可以直接问啊!),用代码来说就是:

var papa = {
    name: "li gang",
    son: function() {
        return this.name;
    }
};
alert( papa.son() );

但是你不和你爸在一块的时候呢?就成了这样:

var son = papa.son;
alert( son() );

你会发现你大家没办法知道你爸的名字了,然后你就不能为非作歹了。好在你还记得你爸的电话号码,打个电话就又可以兴风作浪又知道了:

alert( son.call(papa) );

然后你想了想,不行啊,不能我每次兴风作浪的时候都得打我爸电话吧,我爸还不得弄死我。诶!这么笨,我随身带着我爸的身份证复印件不就好了嘛,所以你就成了这样:

son = son.bind( papa );
alert( son() );

哈哈,爸爸再也不用担心我出门被打叻(๑´ㅂ`๑)!

就这样又过了半年你爸爸大人作死收了一个养子!什么!遗产全部都是我的!养子的中文名叫 二狗子,英文名叫 er~Gou~Zi:

function erGouZi() {
    return this.name;
}

这个二狗子养子也想知道你爸的名字好出去泡妞把妹歌功颂德,哀求了半天之后,老爸也给了他一份复印件:

erGouZi = erGouZi.bind( papa );
alert( erGouZi() );

二狗子这货啊表示非常高兴,决定每次报出爸爸的大名的时候都要加上敬爱的三个字,就像我们经常说敬爱的 x 总理 一样,于是他机智的做了一次小手术:

erGouZi = function() {
    var prefix = arguments[0] || "";
    return prefix + this.name;
}
erGouZi = erGouZi.bind( papa, "great " );
alert( erGouZi() );

又没过多久,这事被老爸知道了。老爸对于二狗子这种舔脚后跟的行为表示非常满意,对他越来越恩爱亲切,对你越来越冷板凳。最后终于老爸把所有的遗产都给了二狗子而你因为平常只会坑蒙拐骗啥技能也不会只能上街乞讨最后被城管暴打而死。

终!

Copied from here

Read More »

Implement JavaScript Curry Function and Invoke it

21-11-2014

copied from here

JavaScript : 實作柯里化(Currying)與部份調用

如果稍微有接觸functional programming的經驗的話,應該對柯里化與部份調用這兩個名詞不會太陌生。

所為柯里化是指:

將多參數函數轉換為一系列單參數函數。它描述了轉換過程,而不是轉換函數的調用。
調用方可以確定應用了多少參數,從而創建一個參數更少的導出函數。

而部份調用是指:

將多參數函數轉換為一個參數更少的多參數函數,其值為提前提供的省略參數的值。
本技術的名稱非常恰當:它將一些參數部分應用到函數,並返回一個具有簽名(由剩餘參數組成)的函數

這樣的解釋可能還是太過抽象了,舉例來說的話,就是例如我有一個一般化的線性方程式:

var linearFunction = function(a, b, x) {
    return a * x + b;
}

這個方程式現在需要3個參數(a、b、x)來決定一個輸出值,每次調用它都需要3個參數,若是在某段程式中不斷調用這個方程式,且a、b的值都是一樣的,我們還是必須一再的把a、b的值代入方程式。但若我們的語言有柯里化的能力,就可以先把a、b值代入方程式,生成一個新的方程式,這個新方程式的a、b值變成固定的,調用這個新方程式時只需傳入x值:

值得注意的是,我們要”生成一個新的方程式”,也就是某個函數會”回傳一個新的函數”,如果我們使用的語言中函數不是一級物件(first-class),就無法把函數當做物件來傳遞,實作柯里化的過程就會稍嫌複雜了(但不是說無法辦到,我們在 之後的文章會用Java的匿名類別來達成這件事)。

Read More »

Deferred in jQuery

21-11-2014

Copied from here

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本。

每个版本都会引入一些新功能。今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能—-deferred对象

这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax。为了实现它,jQuery的全部ajax代码都被改写了。但是,它比较抽象,初学者很难掌握,网上的教程也不多。所以,我把自己的学习笔记整理出来了,希望对大家有用。

本文不是初级教程,针对的读者是那些已经具备jQuery使用经验的开发者。如果你想了解jQuery的基本用法,请阅读我编写的《jQuery设计思想》《jQuery最佳实践》

Read More »

Convert JavaScript object To String

21-11-2014
function objToString (obj) {
    var str = '';
    for (var p in obj) {
        if (obj.hasOwnProperty(p)) {
            str += p + '::' + obj[p] + '\n';
        }
    }
    return str;
}

or

JSON.stringify(obj);

Written with StackEdit.

Read More »

Principal End of One2One Map in EntityFramework

21-11-2014

##What does principal end of an association means?

In one-to-one relation one end must be principal and second end must be dependent. Principal end is the one which will be inserted first and which can exist without the dependent one. Dependent end is the one which must be inserted after the principal because it has foreign key to the principal.

##How to config in FluentAPI? Say we have one to one User and UserProfile entities, and the User is principal, UserProfile is dependant.

class User{
   UserProfile Profile { get;set; }
   //...
}

class UserProfile{
   User User{ get;set; }
   //...
}

Then the fluentAPI configuration will be:

modelBuilder.Entity<User>().HasRequired(u => u.Profile).WithRequiredPrincipal(p => p.User);

Written with StackEdit.

Read More »