document.createElement 出现的报错---Uncaught TypeError: Illegal invocation

document.createElement 出现的报错---Uncaught TypeError: Illegal invocation_第1张图片

报错代码


var createEle = document.createElement;

function render() {
    // 创建导航并且插入
    var nav = createEle('a')
}

render()

知识点

call、aplay在函数执行的时候,改变this;bind是返回一个新的函数

参考文章
相同点:call、apply和bind都是JS函数的公有的内部方法,他们都是重置函数的this,改变函数的执行环节。

不同点:bind是创建一个新的函数,而call和aplay是用来调用函数;call和apply作用一样,只不过call为函数提供的参数是一个个地罗列出来,而apply为函数提供的参数是一个数组。

bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。
apply
与call的区别就是,后面的参数是一个数组
bind:语法和call一模一样,唯一的区别在于立即执行还是等待执行
fn.call(obj, 10, 20) 改变fn中的this,并且把fn立即执行
fn.bind(obj, 10, 20)改变fn中的this,并且此时读fn并没有执行

fn.call(): 把找到的call方法执行
当call方法执行的时候,内部处理的事情
=> 首先把操作函数中的this绑定为第一个参数
=> 把call方法第二个及第二个以后的实参获取到
=> 把要操作的函数执行,并且把第二个以后的传递进来的实参传给函数
call中的细节:
1.非严格模式下,如果参数不传,或者第一个传递的是null/undefined,this是window
2.严格模式下:不传,this是undefined

修改代码

法一:【添加bind】

var createEle = document.createElement.bind(document);
// 任何一个函数都有一个方法---》bind
// bind 用于返回一个 带有明确this指向的 函数


function render() {
    // 创建导航并且插入
    var nav = createEle('a')
}
render()

法二:【创建函数】

function create(name){
	return document.createElement(name)
}

你可能感兴趣的:(程序运行出现的问题,javascript,开发语言,ecmascript)