Git Product home page Git Product logo

blog's Introduction

blog

关于图片管理

个人头像:avatar.<图片格式>,例如:avatar.jpg

文章图片

  • 封面:<语言>_<任务单号>.<图片格式>,例如:js_4.png
  • 详情:<语言>_<任务单号>_detail.<图片格式>,例如:js_4_detail.png

blog's People

Contributors

d-or avatar fengyfei avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

blog's Issues

golang channel 简单示例

package main

import (
	"fmt"
)

func main() {
	nonBlocked()
	nonCacheChannelGeneral()
	blocked()
}

func nonBlocked() {
	ch := make(chan int, 1)

	ch <- 0

	select {
	case <-ch:
		fmt.Println("[nonBlocked]:read from channel")
	default:
		fmt.Println("[nonBlocked]:no data")
	}
}

func blocked() {
	ch := make(chan int)

	ch <- 0

	select {
	case <-ch:
		fmt.Println("[blocked]:read from channel")
	default:
		fmt.Println("[blocked]:no data")
	}
}

func nonCacheChannelGeneral() chan<- int {
	ch := make(chan int)

	go func() {
		select {
		case <-ch:
			fmt.Println("[nonCacheChannelGeneral]:read from channel")
		default:
			fmt.Println("[nonCacheChannelGeneral]:no data")
		}
	}()

	ch <- 0

	return ch
}

index

{
"last": "2017-08-15 19:02:15",
"map": [{
"id": 8, "type": "image", "url": "https://raw.githubusercontent.com/fengyfei/blog/master/images/go_8.png"
},{
"id": 9, "type": "image", "url": "https://raw.githubusercontent.com/fengyfei/blog/master/images/js_9.png"
},{
"id": 10, "type": "image", "url": "https://raw.githubusercontent.com/fengyfei/blog/master/images/horizon_10.png"
}]
}

swift 隐藏键盘

swift 点击除键盘外屏幕的其他位置收回键盘

let tapEmpty = UITapGestureRecognizer(target:self, action: #selector(self.tapEmpty))

self.view.addGestureRecognizer(tapEmpty)

extension YouViewController {
    @objc func tapEmpty() {
        self.view.endEditing(true)
    }
}

Horizon 介绍

Horizon

安装

docker-compose.yaml 文件如下:

rethink:
    container_name: rethink
    image: rethinkdb
    volumes:
      - ./rethink:/data
    ports:
      - "127.0.0.1:8120:8080"
      - "127.0.0.1:28015:28015"
    restart: always
  horizon:
    container_name: horizon
    image: rethinkdb/horizon
    command: su -s /bin/sh horizon -c "hz serve --dev --connect rethinkdb://rethink:28015 --bind all /usr/app"
    volumes:
      - ./horizon:/usr/app
    environment:
      - HZ_SECURE=false
    links:
      - rethink
    ports:
      - "8181:80"

可通过 docker-compose up -d 启动服务。

javaScript FAQ

学习 JS 过程中遇到的Question和Answer.

阐述下 use strict; 的作用

use strict; 顾名思义,就是 JavaScript 会在所谓严格模式下执行,也就是强制开发者避免使用未声明的变量,不过对于老版本的浏览器或者执行引擎则会自动忽略该指令

// Example of strict mode

"use strict";

 
catchThemAll();

function catchThemAll() {

  x = 3.14;		// Error will be thrown

  return x * x;

}

== 与 === 的区别是什么

=== 也就是所谓的严格比较,关键的区别在于**===** 会同时比较类型与值,而不是仅比较值

// Example of comparators

0 == false; // true

0 === false; // false


2 == '2'; // true

2 === '2'; // false

null 与 undefined 的区别

  • null

    • 是一个可以被分配的值,设置为 null 的变量意味着其无值
  • undefined

    • 代表某个变量虽然声明了但是尚未进行过任何赋值

go channel 简单示例

package main

import (
	"fmt"
)

func main() {
	nonBlocked()
	nonCacheChannelGeneral()
	blocked()
}

func nonBlocked() {
	ch := make(chan int, 1)

	ch <- 0

	select {
	case <-ch:
		fmt.Println("[nonBlocked]:read from channel")
	default:
		fmt.Println("[nonBlocked]:no data")
	}
}

func blocked() {
	ch := make(chan int)

	ch <- 0

	select {
	case <-ch:
		fmt.Println("[blocked]:read from channel")
	default:
		fmt.Println("[blocked]:no data")
	}
}

func nonCacheChannelGeneral() chan<- int {
	ch := make(chan int)

	go func() {
		select {
		case <-ch:
			fmt.Println("[nonCacheChannelGeneral]:read from channel")
		default:
			fmt.Println("[nonCacheChannelGeneral]:no data")
		}
	}()

	ch <- 0

	return ch
}

javaScript Promise 简单示例

new Promise(function(resolve, reject) {
    let timeOut = Math.random() * 1.5;

    console.log('set timeout to: ' + timeOut + ' seconds.');

    setTimeout(function () {
        if (timeOut < 1) {
            console.log('call resolve()...');

            resolve('200 OK');
        }
        else {
            console.log('call reject()...');

            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}).then(function(result) {
    console.log('成功:' + result);
}).catch(function(reason) {
    console.log('失败:' + reason);
});

javaScript 箭头函数 详解

图片

前言

胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语法一样,共享this上下文。

箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字this。接下来,让我们来看几个详细的例子。

新的函数语法

传统的JavaScript函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你都必须输入function () {}CoffeeScript如今之所以那么火,有一个不可忽略的原因就是它有更简洁的函数语法。更简洁的函数语法在有大量回调函数的场景下好处特别明显,让我们从一个Promise链的例子看起:

function getVerifiedToken(selector) {
  return getUsers(selector)
    .then(function (users) { return users[0]; })
    .then(verifyUser)
    .then(function (user, verifiedToken) { return verifiedToken; })
    .catch(function (err) { log(err.stack); });
}

以下是使用新的箭头函数语法进行重构后的代码:

function getVerifiedToken(selector) {
  return getUsers(selector)
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));
}

以下是值得注意的几个要点:

  • function{}都消失了,所有的回调函数都只出现在了一行里。
  • 当只有一个参数时,()也消失了(rest参数是一个例外,如(...args) => ...)。
  • {}消失后,return关键字也跟着消失了。单行的箭头函数会提供一个隐式的return(这样的函数在其他编程语言中常被成为lamda函数)。

这里再着重强调一下上述的最后一个要求。仅仅当箭头函数为单行的形式时,才会出现隐式的return。当箭头函数伴随着{}被声明,那么即使它是单行的,它也不会有隐式return

const getVerifiedToken = selector => {
  return getUsers()
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));
}

如果我们的函数内只有一条声明(statement),我们可以不写{},这样看上去会和CoffeeScript中的函数非常相似:

const getVerifiedToken = selector =>
  getUsers()
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));

你没有看错,以上的例子是完全合法的ES6语法。当我们谈论只包含一条声明(statement)的箭头函数时,这并不意味着这条声明不能够分成多行写。

这里有一个坑,当忽略了{}后,我们该怎么返回空对象({})呢?

const emptyObject = () => {};
emptyObject(); // ?

不幸的是,空对象{}和空白函数代码块{}长得一模一样。。以上的例子中,emptyObject{}会被解释为一个空白函数代码块,所以emptyObject()会返回undefined。如果要在箭头函数中明确地返回一个空对象,则你不得不将{}包含在一对圆括号中(({})):

const emptyObject = () => ({});
emptyObject(); // {}

下面是一个更完整的例子:

function () { return 1; }
() => { return 1; }
() => 1
 
function (a) { return a * 2; }
(a) => { return a * 2; }
(a) => a * 2
a => a * 2
 
function (a, b) { return a * b; }
(a, b) => { return a * b; }
(a, b) => a * b
 
function () { return arguments[0]; }
(...args) => args[0]
 
() => {} // undefined
() => ({}) // {}

this

JavaScriptthis的故事已经是非常古老了,每一个函数都有自己的上下文。以下例子的目的是使用jQuery来展示一个每秒都会更新的时钟:

$('.current-time').each(function () {
  setInterval(function () {
    $(this).text(Date.now());
  }, 1000);
});

当尝试在setInterval的回调中使用this来引用DOM元素时,很不幸,我们得到的只是一个属于回调函数自身上下文的this。一个通常的解决办法是定义一个that或者self变量:

$('.current-time').each(function () {
  var self = this;
 
  setInterval(function () {
    $(self).text(Date.now());
  }, 1000);
});

但当使用胖箭头函数时,这个问题就不复存在了。因为它不产生属于它自己上下文的this

$('.current-time').each(function () {
  setInterval(() => $(this).text(Date.now()), 1000);
});

arguments变量

箭头函数与普通函数还有一个区别就是,它没有自己的arguments变量:

function log(msg) {
  const print = () => console.log(arguments[0]);
  print(`LOG: ${msg}`);
}
 
log('hello'); // hello

再次重申,箭头函数没有属于自己的thisarguments。但是,你仍可以通过rest参数,来得到所有传入的参数数组:

function log(msg) {
  const print = (...args) => console.log(args[0]);
  print(`LOG: ${msg}`);
}
 
log('hello'); // LOG: hello

关于yield

箭头函数不能作为generator函数使用。

最后

箭头函数是我最喜欢的ES6特性之一。使用=>来代替function是非常便捷的。但我也曾见过只使用=>来声明函数的代码,我并不认为这是好的做法,因为=>也提供了它区别于传统function,其所独有的特性。我个人推荐,仅在你需要使用它提供的新特性时,才使用它:

  • 当只有一条声明(statement)语句时,隐式return
  • 需要使用到父作用域中的this

原文链接

原文地址

JavaScript 箭头函数

图片

前言

胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语法一样,共享this上下文。

箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字this。接下来,让我们来看几个详细的例子。

新的函数语法

传统的JavaScript函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你都必须输入function () {}CoffeeScript如今之所以那么火,有一个不可忽略的原因就是它有更简洁的函数语法。更简洁的函数语法在有大量回调函数的场景下好处特别明显,让我们从一个Promise链的例子看起:

function getVerifiedToken(selector) {
  return getUsers(selector)
    .then(function (users) { return users[0]; })
    .then(verifyUser)
    .then(function (user, verifiedToken) { return verifiedToken; })
    .catch(function (err) { log(err.stack); });
}

以下是使用新的箭头函数语法进行重构后的代码:

function getVerifiedToken(selector) {
  return getUsers(selector)
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));
}

以下是值得注意的几个要点:

  • function{}都消失了,所有的回调函数都只出现在了一行里。
  • 当只有一个参数时,()也消失了(rest参数是一个例外,如(...args) => ...)。
  • {}消失后,return关键字也跟着消失了。单行的箭头函数会提供一个隐式的return(这样的函数在其他编程语言中常被成为lamda函数)。

这里再着重强调一下上述的最后一个要求。仅仅当箭头函数为单行的形式时,才会出现隐式的return。当箭头函数伴随着{}被声明,那么即使它是单行的,它也不会有隐式return

const getVerifiedToken = selector => {
  return getUsers()
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));
}

如果我们的函数内只有一条声明(statement),我们可以不写{},这样看上去会和CoffeeScript中的函数非常相似:

const getVerifiedToken = selector =>
  getUsers()
    .then(users => users[0])
    .then(verifyUser)
    .then((user, verifiedToken) => verifiedToken)
    .catch(err => log(err.stack));

你没有看错,以上的例子是完全合法的ES6语法。当我们谈论只包含一条声明(statement)的箭头函数时,这并不意味着这条声明不能够分成多行写。

这里有一个坑,当忽略了{}后,我们该怎么返回空对象({})呢?

const emptyObject = () => {};
emptyObject(); // ?

不幸的是,空对象{}和空白函数代码块{}长得一模一样。。以上的例子中,emptyObject{}会被解释为一个空白函数代码块,所以emptyObject()会返回undefined。如果要在箭头函数中明确地返回一个空对象,则你不得不将{}包含在一对圆括号中(({})):

const emptyObject = () => ({});
emptyObject(); // {}

下面是一个更完整的例子:

function () { return 1; }
() => { return 1; }
() => 1
 
function (a) { return a * 2; }
(a) => { return a * 2; }
(a) => a * 2
a => a * 2
 
function (a, b) { return a * b; }
(a, b) => { return a * b; }
(a, b) => a * b
 
function () { return arguments[0]; }
(...args) => args[0]
 
() => {} // undefined
() => ({}) // {}

this

JavaScriptthis的故事已经是非常古老了,每一个函数都有自己的上下文。以下例子的目的是使用jQuery来展示一个每秒都会更新的时钟:

$('.current-time').each(function () {
  setInterval(function () {
    $(this).text(Date.now());
  }, 1000);
});

当尝试在setInterval的回调中使用this来引用DOM元素时,很不幸,我们得到的只是一个属于回调函数自身上下文的this。一个通常的解决办法是定义一个that或者self变量:

$('.current-time').each(function () {
  var self = this;
 
  setInterval(function () {
    $(self).text(Date.now());
  }, 1000);
});

但当使用胖箭头函数时,这个问题就不复存在了。因为它不产生属于它自己上下文的this

$('.current-time').each(function () {
  setInterval(() => $(this).text(Date.now()), 1000);
});

arguments变量

箭头函数与普通函数还有一个区别就是,它没有自己的arguments变量:

function log(msg) {
  const print = () => console.log(arguments[0]);
  print(`LOG: ${msg}`);
}
 
log('hello'); // hello

再次重申,箭头函数没有属于自己的thisarguments。但是,你仍可以通过rest参数,来得到所有传入的参数数组:

function log(msg) {
  const print = (...args) => console.log(args[0]);
  print(`LOG: ${msg}`);
}
 
log('hello'); // LOG: hello

关于yield

箭头函数不能作为generator函数使用。

最后

箭头函数是我最喜欢的ES6特性之一。使用=>来代替function是非常便捷的。但我也曾见过只使用=>来声明函数的代码,我并不认为这是好的做法,因为=>也提供了它区别于传统function,其所独有的特性。我个人推荐,仅在你需要使用它提供的新特性时,才使用它:

  • 当只有一条声明(statement)语句时,隐式return
  • 需要使用到父作用域中的this

原文链接

原文地址

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.