js父级函数调用子函数出现函数未定义问题

博客探讨了在JavaScript中,父级函数尝试调用子函数时遇到的'pageScroll is not defined'错误。问题源于setTimeout的执行机制,它在回调中使用eval执行字符串,导致执行环境切换到window,使得子函数无法被找到。解决方案是将setTimeout的参数由字符串改为对象引用。

首先定义了一个全局函数Locating,又在Locating内定义了一个局部函数pageScroll,然后我全局函数调用pageScroll时,报错Uncaught ReferenceError: pageScroll is not defined。

代码如下:

 

function Locating(locate,time){
        console.log(locate+' -- '+time);
        var div_locate=document.getElementById(locate);
        var window_top_y = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离
        var element_top_y = div_locate.offsetTop;//获取某元素顶部距离页面顶部的距离
        var distance =   window_top_y-element_top_y;//当前窗口与顶部的距离
        var time = time;
var move_distance = time>50?Math.ceil((distance/Math.ceil(time/50))):distance;//每次移动的距离
        //每次移动的位移应为distance/duration,要移动的位置为element_top_y,
          function pageScroll() {
            var top = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离
            var dis_top = top - element_top_y;
                window.scrollBy(0,-move_distance);
                scrolldelay=setTimeout('pageScroll()',50);
                if(dis_top<=0){
                    clearTimeout(scrolldelay);
                }
//              console.log(dis_top);
            }
         pageScroll();
    }

 

一开始以为是作用域链的问题。

但如下相同结构的代码并没有执行错误

 

 function a(){
        console.log("a")
        function b() {
                console.log("b")
            }
        b()
}

琢磨了下。原来是执行调用setTimeout的原因

 

steTimeout函数机制就是用eval执行第一个参数'action()"字符串,既然action()字符串不存在,那么我把它换成了一个对象action进行测试,

原来setTimeout执行完成后,执行环境自动切换到window环境下,所以再次调用pageScroll()时才会出现函数未定义的错误。

解决方法是将

setTimeout('pageScroll()',50)

 

写成

 

setTimeout(pageScroll,50);

即把字符串写成对象。

 

setIntraval执行时是也会把环境切换到window对象下。

 

 

参考链接:

http://blog.youkuaiyun.com/getcomputerstyle/article/details/52101736
http://www.cnblogs.com/yuqingfamily/p/5816560.html

 

组件可以通过以下步骤调用子组件的函数: 1. 在组件中,首先要确保子组件被正确导入。如果使用的是函数式组件,则需要使用 `import` 导入子组件。如果使用的是类组件,则需要使用 `import` 导入子组件,并在组件的 render 方法中包含子组件。 2. 在组件中,创建一个对子组件的引用。这可以通过在组件的 render 方法中使用 ref 属性来实现。 3. 在组件中,通过对子组件引用调用相应的函数调用子组件的函数。这可以在需要的时候触发,例如在按钮点击事件或其他适当的生命周期方法中。 下面是一个示例代码,演示了如何在组件中调用子组件的函数: ```jsx // 导入子组件 import ChildComponent from './ChildComponent'; class ParentComponent extends React.Component { constructor(props) { super(props); // 创建对子组件的引用 this.childRef = React.createRef(); } handleClick = () => { // 调用子组件的函数 this.childRef.current.childFunction(); } render() { return ( <div> {/* 渲染子组件,并将引用传递给子组件 */} <ChildComponent ref={this.childRef} /> <button onClick={this.handleClick}>调用子组件函数</button> </div> ); } } ``` 在上面的示例中,组件通过创建对子组件的引用 `childRef`,并将其传递给子组件的 `ref` 属性,以便在组件中可以访问子组件的函数。然后,通过在按钮的点击事件中调用 `this.childRef.current.childFunction()`,可以调用子组件的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值