如果传入子组件的function是定义在methods中的方法,那么子组件调用此方法时方法内部依然是父组件的this。
function initMethods (vm: Component, methods: Object) {
const props = vm.$options.props
for (const key in methods) {
// ....
// 此处绑定了methods中的函数的this为当前实例
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm)
}
}
/**
* Simple bind polyfill for environments that do not support it,
* e.g., PhantomJS 1.x. Technically, we don't need this anymore
* since native bind is now performant enough in most browsers.
* But removing it would mean breaking code that was able to run in
* PhantomJS 1.x, so this must be kept for backward compatibility.
*/
/* istanbul ignore next */
function polyfillBind (fn: Function, ctx: Object): Function {
function boundFn (a) {
const l = arguments.length
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
boundFn._length = fn.length
return boundFn
}
function nativeBind (fn: Function, ctx: Object): Function {
return fn.bind(ctx)
}
export const bind = Function.prototype.bind
? nativeBind
: polyfillBind