ReactNative從學習到放棄——準備工作

ReactNative是Facebook剛出的一個可以跨平臺(Android和ios)開發的控件,現在非常流行,雖然還有很多坑,不過學習一下應用到項目中某些模塊還是很不錯的。所以我這個小菜鳥就準備學習一下啦,這篇文章我就先簡單介紹一下準備工作吧!

一、環境搭建
具體環境搭建可以參考rn官方中文網
http://reactnative.cn/docs/0.30/getting-started.html#content
補充:
修改配置文件,可以使用vi命令,按esc進入命令行模式,輸入:wq保存並quit。
剛開始使用vi的時候很不習慣,還有一些insert模式等,具體可以百度一下。
坑:
我用的mac,mac在配置adb環境的時候,不要按照網站中的寫法,~/這種路徑寫法不行,還是要把全路徑寫進去。

二、js語法學習
(這篇文字是給Android和ios愛好者介紹的,js大神就可以忽略掉這篇文章啦)
環境配好了,在學習rn之前還有一個重要任務就是學習一下js語法,js是動態語言,特別靈活,對於我們這種以java爲主的人來說剛開始很不習慣,不過寫多了應該就好多了,總體上感覺js特別靈活,寫起來感覺也快很多。推薦大家看一下廖雪峯的js教程,簡單易懂而且全面。http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
我就簡單挑一些比較重要的講一下。

1、說js是動態語言,相比較java,它特殊的地方在哪裏呢?
js數組可以包含任意數據類型,比如:[1, 2, 3.14, ‘Hello’, null, true];
js中可以把任意數據類型賦值給變量,一個變量可以反覆賦值,var只能申明一次,如下:
var a = 123; // a的值是整數123
a = ‘ABC’; // a變爲字符串
是不是覺得很神奇,可以根據你賦值的類型來自動轉換變量類型,哈哈!

2、===和==
大家應該都知道java中==和equal的區別吧,js中也有==和===,但是這兩個符號跟java沒有任何聯繫。
js中==可以將兩個類型自動轉換爲相同類型,然後再進行比較,比如 “1”==1,就會返回true。
===不會自動轉換類型,不同類型返回就是false,相同類型並且值相等返回true,”1”===1,返回false。
所以啊,我們以後就儘量用===吧,避免使用==。

3、數組中的函數
splice——它可以從指定的索引開始刪除若干元素,然後再從該位置添加若干元素
slice——相當於java中的substring方法
unshift,頭部添加若干元素,shift刪除第一個元素
indexOf,搜索指定元素的位置。

4、先看下面的函數

function foo() {
    var x = 'Hello, ' + y;
    alert(x);
    var y = 'Bob';
}

返回的是啥呢,java這種寫法是報錯的,作爲動態語言的js這種寫法當然不會報錯啦,上段代碼返回的是 Hello,undefined 。
爲什麼呢?
原來js引擎可以提升變量y的聲明,雖然寫在下面,畢竟人家是動態語言嘛,但是js引擎卻不能給y賦值,所以是undefined。

5、js中還有一個比較啃爹的地方,看一下下面的函數

function getAge() {
    var y = new Date().getFullYear();
    return y - this.birth;
}
var xiaoming = {
    name: '小明',
    birth: 1990,
    age: getAge
};
xiaoming.age(); // 25, 正常結果
getAge(); // NaN

java中經常會簡單this,指向這個類,js也有this,不過js沒有類的概念,那他指向的是啥咧?
竟然是視情況而定(真是啃爹死了!),如果以對象的方法形式調用,比如xiaoming.age(),該函數的this指向被調用的對象,也就是xiaoming,這是符合我們預期的。
如果單獨調用函數,比如getAge(),此時,該函數的this指向全局對象。
看樣子動態語言動態的有點過頭了!

6、高階函數
map方法定義在js的Array中,如下:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); 
// ['1', '2', '3', '4', '5', '6', '7', '8', ‘9’]

reduce方法
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

fliter過濾某些元素,返回剩下元素,根據傳入函數依次作用在每個元素,根據返回值是true還是false來決定保留還是丟棄該元素。
sort方法

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
}); // [1, 2, 10, 20]

7、閉包

function lazy_sum(arr) {
    var sum = function () {
        return arr.reduce(function (x, y) {
            return x + y;
        });
    }
    return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15

內部函數sum可以引用外部函數lazy_sum的參數和局部變量,返回函數sum的時候,相關參數和變量都保存在返回的函數中,這種就是閉包。
當然閉包還有其他作用啦!
閉包攜帶局部變量x,外部代碼無法訪問到變量x,閉包攜帶狀態的函數,所以對外來說是完全隱藏起來的。
還有,例如計算x的y次方

function make_pow(n) {
    return function (x) {
        return Math.pow(x, n);
    }
}
// 創建兩個新函數:
var pow2 = make_pow(2);
var pow3 = make_pow(3);
pow2(5); // 25
pow3(7); // 343

8、箭頭函數
x => x * x 相當於function (x) { return x * x; }

// 兩個參數:
(x, y) => x * x + y * y

// 無參數:
() => 3.14

// 可變參數:
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}
返回參數
x => ({ foo: x })

今天RN學習先學到這裏,主要是熟悉一下js語法,靜態語言寫多了,剛接觸動態語言肯定有各種不適應,不過多寫寫就習慣啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章