Posted by on August 9, 2018
dump.js:
function func1(){
console.log("func1!!");
}
console.log(func1.toString());
If you know nodejs, you can use node to do test as below.
node dump.js
Call and apply are the other ways to call function. The first parameter will replace this, and the difference between call and apply is the rest parameters. Call uses normal parameter input, and apply uses the array-based parameter input.
Normal function call:
Example:
var obj={
x:5,
z:'zzz',
func1:function(){
console.log('this.x: '+this.x+', this.y: '+this.y+', this.z: '+this.z+', arguments: '+JSON.stringify(arguments));
}
}
obj.func1();
Output:
this.x: 5, this.y: undefined, this.z: zzz, arguments: {}
Use `call` to call function:
Example:
var obj={
x:5,
z:'zzz',
func1:function(){
console.log('this.x: '+this.x+', this.y: '+this.y+', this.z: '+this.z+', arguments: '+JSON.stringify(arguments));
}
}
obj.func1.call({x:10,y:5}, "argv1", "argv2");
Output:
this.x: 10, this.y: 5, this.z: undefined, arguments: {"0":"argv1","1":"argv2"}
Use `apply` to call function:
Example:
var obj={
x:5,
z:'zzz',
func1:function(){
console.log('this.x: '+this.x+', this.y: '+this.y+', this.z: '+this.z+', arguments: '+JSON.stringify(arguments));
}
}
var args=[];
args.push("argv1");
args.push("argv2");
obj.func1.apply({x:10,y:5}, args);
Output:
this.x: 10, this.y: 5, this.z: undefined, arguments: {"0":"argv1","1":"argv2"}
var PENDING = 0;
var FULFILLED = 1;
var REJECTED = 2;
/**
* Check if a value is a Promise and, if it is,
* return the `then` method of that promise.
*
* @param {Promise|Any} value
* @return {Function|Null}
*/
function getThen(value) {
var t = typeof value;
if (value && (t === 'object' || t === 'function')) {
var then = value.then;
if (typeof then === 'function') {
return then;
}
}
return null;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*
* @param {Function} fn A resolver function that may not be trusted
* @param {Function} onFulfilled
* @param {Function} onRejected
*/
function doResolve(fn, onFulfilled, onRejected) {
var done = false;
try {
fn(function (value) {
if (done) return
done = true
onFulfilled(value)
}, function (reason) {
if (done) return
done = true
onRejected(reason)
})
} catch (ex) {
if (done) return
done = true
onRejected(ex)
}
}
function Promise(fn) {
// store state which can be PENDING, FULFILLED or REJECTED
var state = PENDING;
// store value once FULFILLED or REJECTED
var value = null;
// store sucess & failure handlers
var handlers = [];
function fulfill(result) {
state = FULFILLED;
value = result;
handlers.forEach(handle);
handlers = null;
}
function reject(error) {
state = REJECTED;
value = error;
handlers.forEach(handle);
handlers = null;
}
function resolve(result) {
try {
var then = getThen(result);
if (then) {
doResolve(then.bind(result), resolve, reject)
return
}
fulfill(result);
} catch (e) {
reject(e);
}
}
function handle(handler) {
if (state === PENDING) {
handlers.push(handler);
} else {
if (state === FULFILLED &&
typeof handler.onFulfilled === 'function') {
handler.onFulfilled(value);
}
if (state === REJECTED &&
typeof handler.onRejected === 'function') {
handler.onRejected(value);
}
}
}
this.done = function (onFulfilled, onRejected) {
// ensure we are always asynchronous
setTimeout(function () {
handle({
onFulfilled: onFulfilled,
onRejected: onRejected
});
}, 0);
}
this.then = function (onFulfilled, onRejected) {
var self = this;
return new Promise(function (resolve, reject) {
return self.done(function (result) {
if (typeof onFulfilled === 'function') {
try {
return resolve(onFulfilled(result));
} catch (ex) {
return reject(ex);
}
} else {
return resolve(result);
}
}, function (error) {
if (typeof onRejected === 'function') {
try {
return resolve(onRejected(error));
} catch (ex) {
return reject(ex);
}
} else {
return reject(error);
}
});
});
}
doResolve(fn, resolve, reject);
}
console.log('before p1');
var p1=new Promise(function(resolve, reject){
setTimeout(function(){
resolve(3);
}, 5000);
});
p1.then(function(){
console.log('ok!!');
}, function(){
console.log('fail!!');
});
p1.done(function(){
console.log('done!!');
});
console.log('after p1');
To be continued…