如何在JS中传递this参数的

JavaScript099

如何在JS中传递this参数的,第1张

首先,你上面的js写法就有问题了。onchage="change1(this)"中的this表示当前表单组件的DOM对象,你上面的意思是表示name="name" 的文件框DOM对象,当值改变时,传this对象之后你的chang1(this)的方法是获取到了name="name" 的文件框的值。

如果你想在function sub()函数中调用chang1(),可以看我下面的写法

function sub(){

var obj = document.getElementByName('name')[0]//获取name="name" 的文件框DOM对象

chang1(obj)

}

希望对你有帮助。。。

addEvent.exec=function (){

for(var i in this.events[type]){

this.events[type][i]()

}

这段的this结合上面一行事件的绑定代码obj['on' + type] = addEvent.exec,this就是obj对象这点你理解的没错。但

obj['on' + type] = addEvent.exec

obj['on' + type] = function (){

for(var i in this.events[type]){

     this.events[type][i]()

 }

}

是不同的,使用obj['on' + type] = addEvent.exec,addEvent.exec所指的函数中的变量type是获得不到值的,因为addEvent.exec在函数addEvent之外定义,而type变量的作用域仅在addEvent函数内。

所以做以下改动:

将obj['on' + type] = addEvent.exec改为obj['on' + type] = function(){addEvent.exec.apply(this,[type])}

addEvent.exec=function (){

for(var i in this.events[type]){

this.events[type][i]()

}

       加入参数type:

       addEvent.exec=function (type){

for(var i in this.events[type]){

this.events[type][i]()

}

完整代码:

<html>

 <head>

    <meta http-equiv="content-type" content="text/htmlcharset=utf-8">

    <title>百度一下,你就知道</title>

 </head>

 <body>

 <button id="btn">按钮1</button>

 <button  onclick="addEvent(document.getElementById('btn'), 'click',function(){alert('事件处理1.')})">为按钮1绑定click事件1</button>

 <button  onclick="addEvent(document.getElementById('btn'), 'click',function(){alert('事件处理2.')})">为按钮1绑定click事件2</button>

<script>

window.i=1

function addEvent(obj, type, fn) {

//if (typeof obj.addEventListener != 'undefined') {

//obj.addEventListener(type, fn, false)

//} else {

//创建一个存放事件的哈希表(散列表)

if (!obj.events) obj.events = {}

//第一次执行时执行

if (!obj.events[type]) {

//创建一个存放事件处理函数的数组

obj.events[type] = []

//把第一次的事件处理函数先储存到第一个位置上

if (obj['on' + type]) obj.events[type][0] = fn

}

//从第二次开始我们用事件计数器来存储

obj.events[type][addEvent.ID++] = fn

//执行事件处理函数

obj['on' + type] = function(){addEvent.exec.apply(this,[type])}

//}

}

//为每个事件分配一个计数器

addEvent.ID = 1

addEvent.exec=function (type){

for(var i in this.events[type]){

  this.events[type][i]()

}

}

</script>

 </body>

</html>

1.arguments,伪数组,包含函数中所有的参数

2.函数如果不给任何条件,那么this默认指向window

3.如果要指定this就通过call来传this

fn.call(1)

如果传的this不是对象,那么js会自动帮忙封装为对象 

这时的this是1对象

如何声明的时候不转化为对象呢

function fn(){

'use strict'

console.log(this)

}

fn.call(1),this就是1

f.call(1,2,3,4)

此时对象1就是this,234就是arguments

4.this是隐藏参数,arguments是显示参数

5.let person={

name:'frank',

sayHi(){

console.log("你好,我叫"+person.name)}

}

我们可以用直接保存了对象地址的变量获取name

这种方法称为引用:变量保存了对象的地址

6.js在每一个函数都加上一个this,用this获取目前还不知道名字的对象

7.call指定this

fn.call(this,参数1,参数2)