js函数执行顺序

js函数在执行过程:

1、首先对载入的js文件每个js代码块进行扫描,读入第一个代码块,进行语法扫描处理;

2、如果语法错误,则浏览器报错,该代码块不再进行扫描执行;如果有第二个代码块则进入第二个代码块进行相同的处理动作,依次递推,直至结束;

3、语法没有错,扫描代码中有没有需要做预编译处理的代码,如已定义的变量和定义是函数,有的话则进行预编译处理,处理完之后再进行至上而下的处理;遇到赋值函数时,不做预编译处理(必须先定义后引用),待到调用时再处理。(这一步不会出现报错的情况,因为浏览器只解析正确的声明)

代码理解:

<script type="text/javascript">
    Fn();  //因为是定义式函数,所以Fn() 会被浏览器首先提出来进行预编译处理,称为函数提升,然后再从上而下执行改代码块
    function Fn(){
        alert("代码块1:定义式函数")
    }  //弹出:定义式函数
</script>
<script type="text/javascript">
   var Fn()=function(){
        alert("代码块2:赋值式函数")
    }  //弹出:赋值式函数
    Fn(); //调用必须在赋值式函数后面,否则报错:Fn() is not a function
</script>

4、执行代码,有错报错。(比如变量未定义)

5、执行下一个代码块,回到第2步,重复执行。

6、直至代码结束。

js代码块直接的关系是相互独立的,但变量和方法是共享的。

代码理解:

关系是相互独立的:
<script type="text/javascript">       
alert(str);  //str未定义,浏览器报错,下面代码不执行
test = "我是代码块一变量";  //全局变量test
</script>
<script type="text/javascript">   
alert("我是代码块二");   //弹出"我是代码块二"
alert(test); //弹出 undefined
</script>
变量和方法是共享:
<script type="text/javascript">       
alert("我是代码块一"); 
test = "我是代码块一变量";  //全局变量test
</script>
<script type="text/javascript">   
alert("我是代码块二"); 
alert(test); //弹出"我是代码块一变量"
</script>



### 控制 JavaScript 中异步函数执行顺序的最佳实践 #### 使用 `async` 和 `await` 为了更好地控制异步操作的顺序并保持代码可读性和维护性,推荐使用 `async/await` 结构。这种方式可以简化复杂的 Promise 链,并使代码看起来更像同步编程。 ```javascript async function processTasks() { try { const result1 = await taskOne(); console.log('Task One Completed:', result1); const result2 = await taskTwo(result1); console.log('Task Two Completed:', result2); const finalResult = await taskThree(result2); console.log('All Tasks Completed:', finalResult); } catch (error) { console.error('Error occurred during processing tasks', error); } } ``` 这种方法不仅提高了代码的易读性,还使得错误处理更加直观[^1]。 #### 并发执行多个异步任务 当有多个不依赖彼此结果的任务时,可以通过 `Promise.all()` 来并发执行这些任务,从而提高效率: ```javascript function performConcurrentOperations() { const operationPromises = [ asyncOperationOne(), asyncOperationTwo(), asyncOperationThree() ]; return Promise.all(operationPromises).then((results) => { // 所有操作完成后处理结果 results.forEach((result, index) => { console.log(`Operation ${index + 1} completed with result`, result); }); }).catch(error => { console.error('An error occurred while performing concurrent operations.', error); }); } ``` 这允许同时启动多项独立的工作,在它们全部完成后再继续下一步逻辑[^2]。 #### 处理条件性的异步流程 对于那些基于某些条件决定是否要运行特定异步任务的情况,则可以在 `if-else` 或者其他分支语句内嵌入相应的异步调用: ```javascript async function handleConditionalAsyncFlow(condition) { let data; if (condition === 'specific') { data = await specificConditionHandler(); } else { data = await defaultHandler(); } console.log('Handled conditionally based on input:', data); } ``` 通过这种方式可以根据不同的业务场景灵活调整异步工作的流向[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值